2016-08-06 10 views
-2

インターネットを検索しようとするとアンサーが見つかりませんでした。2つのベクトルの間の角度を計算する

私は最初のベクトルから見た2つのベクトルの間の角度を計算しようとしています。したがって

それが-1,0で90

あろうベクトル1が0,0であり、ベクトル2が1,1である見出しが1,0で45

であるかどう270となります。

これを作成する簡単な方法はありますか?

+0

、マークは、ベアリング、見出しのような用語としての "見出し" を使用していないと言うゲーム物理学の技術的な意味を持っています。 "角度"を参照するだけでベストか、具体的には "時計回りの角度"が望ましいと思います – Fattie

+0

また、ドットプロダクト(Unityに組み込まれている関数があります)やっている。 – Fattie

+0

これは有効な質問です。私は誰がそれをダウンボトムにする必要性を感じたのか、そしてなぜそれを知るのが大好きです。 –

答えて

-2

私は、ATMそれをテストすることはできませんが、これは動作するはずです:

double getHeading(Vector2 a, Vector2 b) 
{ 
    double x = b.x - a.x; 
    double y = b.y - a.y; 
    return Math.Atan2(y, x) * (180/Math.PI); 
} 
-1

これはユニティではない、これは数学の質問です。

ベクトルdot multiplicationを使用する必要があります。それは単一性に組み込まれており、ベクトルの長さにそれらの間の角度の余弦を掛けた積に等しいので、簡単にベクトル間の角度を取得できます。もちろん、統一はbuilt-in function for thatです。

ベクトルを含む多くの操作がフレームごとに実行されるため、実行しているコードのパフォーマンスへの影響を知ることができます。悲しいことに、この質問に対する他の解決策は計算上複雑です。また、アングルそのものは必要ありません。角度の余弦は実際には簡単に操作できます。

もちろん、この回答は270度のケースをカバーしていません。しかし、この種のアプリケーションでは、Quaternionsがはるかによく適合します。基本的に、270の場合はベクトルを計算する必要があります。ベクトル自体(数学の抽象として)にはその情報が含まれていません。つまり、数学レベルでは、それらの間に270度と90度のベクトルがあります。だから、

、あなたが本当に270の場合、create quaternions from the vectorsを必要とする(ところで、あなたはアップベクトルは、ここでの情報の個別の作品であることがわかります)、その後calculate the angle between them場合。ベクタとは異なり、クォータニオンは回転と方向を処理するために作成され、Unityにはすべての機能が実装されています。

+0

あなたのanwserマックスありがとう、これは確かに数学の質問でした。しかし、私はこれを計算する単純な統一関数が存在することを願っていました。私はそれを手動で行うことに決めました。 – Mark

+0

クォータニオンを使用している場合は、あります。ベクトルを使用する場合、270度の場合は得られません。 –

-2

ご回答いただきありがとうございます。マニュアル計算をすることにしました。私の後にこの質問を見つけた人のために が、これは私がそれをやった方法です:

double calculateHeading(Transform target){ 
    double newHeading = 0; 

    Vector3 vectorToTarget = target.position - transform.position; 
    double x = vectorToTarget.x; 
    double y = vectorToTarget.y; 

    if (x == 0 && y > 0) { 
     newHeading = 0; 
    } else if (x == 0 && y < 0) { 
     newHeading = 180; 
    } else if (x > 0 && y == 0) { 
     newHeading = 90; 
    } else if (x < 0 && y == 0) { 
     newHeading = 270; 
    } else if (y < 0) { 
     newHeading = 180 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x/vectorToTarget.y)); 
    } else if (y > 0) { 
     newHeading = 360 + (Mathf.Rad2Deg * Mathf.Atan (vectorToTarget.x/vectorToTarget.y)); 
    } 

    if (newHeading > 360) { 
     newHeading -= 360; 
    } else if (newHeading < 0) { 
     newHeading += 360; 
    } 

    return newHeading; 
} 
-2

デュードは、Googleを使用しようとしたのですか?私はちょうど "二つのベクトルの間の単一性の角度"を探究し、公式の文書を見つけました。

https://docs.unity3d.com/ScriptReference/Vector3.Angle.html

var angle = Vector3.Angle(Vector3 from, Vector3 to); 

またはあなたのケースで

var angle = Vector2.Angle(Vector2 from, Vector2 to); 
関連する問題