2016-04-07 11 views
1

explain problemジェスチャからCW又はACW回転、3

ユーザがAとunity3dにおけるCへ移動するものの(VIA)B(画面上のサンプル点)から開始するサンプル点を注文するかどうかを決定します。この時点で、私は両方の画像でほぼ45度(ほぼ)である計算された角度(シータ)を持っています。問題は左の画像のユーザがCounterClockWiseの動きを意図し、右の画像のユーザが時計回りの回転を意図していると結論したいと思います。 ああ、私の想像よりも本当に複雑です、お勧めします。

現在、統一コードは

protected void calcAngles(){ 
    v1 = go2.position - go1.position; 
    v2 = go3.position - go1.position; 
    v3 = go3.position - go2.position; 
    float angle = Vector3.Angle (v2, v1); 
    Debug.Log ("angle:" + angle.ToString()); 
    //float atan = Mathf.Atan2 (Vector3.Dot (v3, Vector3.Cross (v1, v2)), Vector3.Dot (v1, v2)) * Mathf.Rad2Deg; 
    //Debug.Log ("atan2:" + atan.ToString()); 
} 

任意のアイデアのようなものですか。?擬似コード。あらかじめ大変感謝しています。歓声、ララ

+0

群衆シミュレータを構築しない場合(少し重くなるので)、Aヘルパーの子として2ヘルパー変換を使用することができます彼らはローカル空間の0,0,0の位置にあります。 1つは** LookAt(B)を使用している**もう1つは** LookAt(C)**を使用しています。それでYユーラー角度の差を取ることができます。時計回りまたは反時計回りに回転する必要があるかどうかがわかります。 –

+0

"群衆シミュレータ"あなたは何を紹介していますか、ニカ? – Fattie

+0

赤から緑への方向を得るのは簡単です。それは単に赤からマイナスの緑です。 LookAtは関係ありません。 *実際に変換するために使用されています*。単純に方向を取得するには、単に位置を減算し、おそらく.normalize – Fattie

答えて

2

これを行うために信じられないほど難しいです。

これは、これは2Dのコンセプトであることを...

private float bestKnownXYCWAngleFromTo(Vector3 a, Vector3 b) 
// the best technology we have so far 
    { 
    a.z = 0f; 
    b.z = 0f; 

    float __angleCCW = Mathf.Atan2(b.y, b.x) - Mathf.Atan2(a.y, a.x); 
    if (__angleCCW < 0f) __angleCCW += (2.0f * Mathf.PI); 

    float __angleCWviaatan = (2.0f * Mathf.PI) - __angleCCW; 
    __angleCWviaatan = __angleCWviaatan * (Mathf.Rad2Deg); 

    if (__angleCWviaatan >= 360.0) __angleCWviaatan = __angleCWviaatan-360.0f; 

    return __angleCWviaatan; 
    } 

ノートを助け、あなたが必要とするよう変更することができます。明らかに "" ちょうどあなたの(B-A)であり、 "B" だけで、あなたの(C-A)である


ノートは真のジェスチャー認識は非常に高度な研究分野であることに注意してください。私は努力のエンジニア-年の文字通り数十を表す

https://www.assetstore.unity3d.com/en/#!/content/14458

https://www.assetstore.unity3d.com/en/#!/content/21660

、そこに解決策の1を取得することをお勧めします。

+0

ちょうど大きなおかげで言及したかったと本当に多くを意味します。そのような詳細な考え方と主な決定方程式を参考にしてください。 – lala

+0

ちょっと待ってください。ここにそれらにフラグを立てることができます – Fattie

0

uguups。前からの私の答えは完全に間違っていた。 Vector3.Angleは常に符号なしの角度を与えるようです。しかし、時計回りか反時計回りかを理解するための標識が必要です。

ここで、このコードは、あなたの2つのベクトルの間にSIGNED角度を与えます。 Normal引数は、考慮する平面の法線でなければなりません。

float SignedAngle(Vector3 from, Vector3 to, Vector3 normal){ 

     float angle = Vector3.Angle(from,to); 
     float sign = Mathf.Sign(Vector3.Dot(normal, Vector3.Cross(from,to))); 
     float signed_angle = angle * sign; 

     return signed_angle; 
    } 
+1

いいえ、Vector3.Angleは常に180度未満の正の角度を返します。 –

関連する問題