質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3574閲覧

Unity 延長戦上の点の座標をプログラムで求める

yuki_snow

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/11/04 08:37

前提・実現したいこと

UnityとOculusRiftでVRゲームを作っています
敵をロックオンしたら敵の座標点(点A)とプレイヤーの座標点を結ぶ直線のプレイヤー側(点B)、延長線上にある点Pの座標を求めたい

発生している問題・エラーメッセージ

敵のグローバル座標とプレイヤーのグローバル座標から座標点を求めたかったが遠いところに設定されてしまった。

該当のソースコード

C#

1// 引き寄せ計算 2 m_LockedEnePos = LockOnObj.transform.position; // ロックオン時の敵の座標を取得 3 m_LockedPlyPos = transform.position; // ロックオン時の自の座標を取得 4 m_LerpVector = (m_LockedPlyPos - m_LockedEnePos).normalized; // ロックオン時の敵からプレイヤーの向きを正規化 5 Vector3 m_WorldVector = new Vector3(0, 0, 1); // Z軸 6 if(Vector3.Dot(m_WorldVector, m_LerpVector) >= 0) // Z軸と比べて正なら 7 { 8 m_LookatVec = m_LockedPlyPos / 1.1f - m_LockedEnePos; // グローバル座標の負の方向に延長する 9 // ABベクトルの向きがZ軸との比較で正負が違うと延長線上の点の位置が変わるので向きによって計算を変えてる 10 11 } 12 else if(Vector3.Dot(m_WorldVector, m_LerpVector) < 0) // Z軸と比べて負なら 13 { 14 m_LookatVec = m_LockedPlyPos * 1.1f - m_LockedEnePos; // グローバル座標の正の方向に加算する 15 }
// 引き寄せ public void LookatVec() { // 向いている座標までLerpで進む if (PlyCon.m_RushFlg) // 連続パンチに移行するのでLerpを止める { PlyCon.m_LookatVec = LockedEnemy.transform.position; LockedEnemy.transform.position = Vector3.Lerp(PlyCon.m_LockedEnePos, PlyCon.m_LookatVec, m_LerpTime); } else { LockedEnemy.transform.LookAt(PlyCon.m_LookatVec); // 指定した座標を向く LockedEnemy.transform.position = Vector3.Lerp(PlyCon.m_LockedEnePos, PlyCon.m_LookatVec, m_LerpTime); Debug.Log("向かうベクトル座標:" + PlyCon.m_LookatVec); Debug.Log("ロックオン時の敵座標:" + PlyCon.m_LockedEnePos); Debug.Log("ロックオン時の自分の座標:" + PlyCon.m_LockedPlyPos); } }

試したこと

実際の数値
m_LockedEnePos(-8.4, 0.3, -18.1)
m_LockedPlyPos(-8.0, 0.5, -16.4)
敵(m_LockedEnePos)→プレイヤー(m_LockedPlyPos)

補足情報(FW/ツールのバージョンなど)

Unity2020.1.0f1 Personal
OculusRift

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

話がいまいちわかりませんが…
線分の2端点が,

  • m_LockedEnePos
  • m_LockedPlyPos

であり,この線分の延長線上の座標として m_LookatVec を求めたいのでしょうか?

もしそうであれば,

  • m_LookatVec = m_LockedPlyPos / 1.1f - m_LockedEnePos;
  • m_LookatVec = m_LockedPlyPos * 1.1f - m_LockedEnePos;

という(一方の側の座標だけを定数倍するような)計算では,一般に,その結果は延長線上にならないでしょう.

m_LerpVectorなる線分の方向に沿うベクトルが計算されているようですから,それを使う形を考えてはどうでしょうか.
(というか,この式のm_LockedPlyPos が,本来はm_LerpVectorであるべき,みたいな間違いなのか?)

投稿2020/11/04 09:11

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_snow

2020/11/05 00:28

説明が足りず申し訳ありません。 fanaさんの言っていることで間違いありません。 m_LookatVecはプレイヤーの座標(m_LockedPlyPos)を通りすぎた一点としたいのです。 ()内を試してみます。解決しなければもう一度コメントします。
fana

2020/11/05 01:49

書き方が悪かったですが, 回答内末尾の()は, (意味的に一方の側だけを定数倍するのが不思議なので) 少なくとも 1.1 倍するような対象というのは「線分に沿うベクトル」であるべきではないのか? 的な,間違いの方向性の話 であり, 単純に m_LockedPlyPos を m_LerpVector に変えればそれで済むという話ではありません. --- 変数名だと長いので,質問文内で用いられている{A, B, P}で書きますが, 線分を以下のように図にしたとき… A------B 求めたいPというのが A------B---P 的な場所であるならば,Pの算出というのは,単純には ベクトル(B-A):A----->B の長さを所望の長さに直したものをA(あるいはB)に加える という話になると思います. で,「1.1倍」とかいうのは,この「所望の長さに直す」に対応するような意図の記述なのではないかな,という.
yuki_snow

2020/11/05 01:57

回答ありがとうございます。 >求めたいPというのが・・・ という部分を試したらうまくいきました!ベクトルというものを勘違いしていたようでした。もう少し勉強してから他に取り組みます・・・ ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問