2016-04-07 3 views
1

explain problemEntscheidung, ob CW oder ACW Drehung von Gestik, 3 geordnete Abtastpunkte

Benutzer beginnt, von A bis C und bewegt sich aber (via) B (Abtastpunkte auf dem Bildschirm) in unity3d. An diesem Punkt habe ich den Winkel (Theta) berechnet, der in beiden Bildern fast 45 Grad (fast) beträgt. Problem ist, ich wollte schließen, dass im linken Bild Benutzer CounterClockWise Bewegung beabsichtigt und im rechten Bild Benutzer im Uhrzeigersinn Rotation. ahh, es ist wirklich kompliziert, als ich mir vorgestellt habe, bitte schlagen Sie vor.

derzeit Einheitscode ist wie

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()); 
} 

irgendwelche Ideen.? Psudo-Code. Vielen Dank im Voraus. Prost, lala

+0

Wenn Sie keinen Crowd-Simulator erstellen wollen (weil das etwas schwer wird), könnten Sie 2 Helfer-Transformationen als Kind von A verwenden Sie sind auf 0,0,0 Position im lokalen Raum. Einer verwendet ** LookAt (B) ** ein anderer verwendet ** LookAt (C) **. Dann könntest du einfach den Unterschied zwischen ihren Y-Euler-Winkeln nehmen. Dies wird Ihnen sagen, wenn Sie im oder gegen den Uhrzeigersinn drehen müssen. –

+0

"Crowd Simulator" Worauf beziehen Sie sich, Nika? – Fattie

+0

, um die Richtung von rot nach grün zu bekommen, ist trivial. es ist einfach rot minus grün. LookAt ist nicht relevant. das wird verwendet, um * eine 'Transformation' zu drehen. Um einfach die Richtung zu erhalten, subtrahieren Sie einfach die Positionen und vielleicht .normalize – Fattie

Antwort

2

Es ist unglaublich schwierig dies zu tun.

Diese helfen ...

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; 
    } 

beachten Sie, dass dies ein 2D-Konzept ist, ändern, wie Sie benötigen.

Notiz, die offensichtlich "a" ist nur Ihre (b-a) und "b" ist nur Ihr (c-a)


Bitte beachten Sie, dass wahre Gestenerkennung ein Feld sehr weit fortgeschritten Forschung. Ich ermutige Sie, eine der Lösungen aus dorthin zu gelangen,

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

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

Erforderlich ist eine buchstäblich Dutzende von Ingenieur-Jahren der Anstrengung. PDollar ist großartig (diese Implementierung ist sogar kostenlos im Asset Store!)

+0

wollte nur einen großen Dank sagen, und es bedeutet wirklich viel. so ein detaillierter Gedanke mit Referenzen und Hauptgleichung zu entscheiden. – lala

+0

warten nur auf weitere Fragen, Kumpel !! Sie können ihnen hier melden – Fattie

0

Uuups. Meine Antwort von vorher war völlig falsch. Es scheint, dass Vector3.Angle immer einen vorzeichenlosen Winkel gibt. Aber wir brauchen das Zeichen um zu verstehen, ob es sich im oder gegen den Uhrzeigersinn dreht.

Jetzt wird dieses Stück Code Ihnen einen signierten Winkel zwischen Ihren zwei Vektoren geben. Das Argument Normal sollte die Normale für die Ebene sein, die Sie berücksichtigen möchten.

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

nein, Vector3.Angle liefert immer einen positiven Winkel von weniger als 180 Grad. –