2016-04-17 9 views
0

haben Sie eine Hand der Uhr, die der Spieler einmal anfängt zu drehen (Ziehen) CCW, bis er eine volle Umdrehung beendet. (Ohne den Widerstand zu heben)Beschränkung der Drehrichtung in Echtzeit

Ich versuche die Rotation nur in CCW-Richtung zu sperren, während/sobald der Spieler anfängt zu rotieren. Ich habe Hilfe von den folgenden Links: [Detect Richtung] [1] durch @ BobBobson108

Hier ist gif von dem, was tatsächlich passiert: Demo

void OnMouseDrag() 
{ 
    //rotation 
    Vector3 mousePos = Input.mousePosition; 
    mousePos.z = 5.23f;   

    Vector3 objectPos = Camera.main.WorldToScreenPoint(transform.position);   
    mousePos.x = mousePos.x - objectPos.x; 
    mousePos.y = mousePos.y - objectPos.y; 
    angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg; 
    transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle - 90f)); 


    hand_vector = transform.up; 
    cross_product = Vector3.Cross(ref_vector, hand_vector); 
    dot_product = Vector3.Dot(cross_product, transform.forward*-1); 
    //Debug.Log("Hand Vector: " + hand_vector); 
    //Debug.Log("Ref Vector: " + ref_vector); 
    Debug.Log(cross_product); 
    Debug.Log(dot_product); 
} 

Ich habe versucht, die Werte des Kreuzprodukts zu debuggen, aber die Richtung des resultierenden Vektors scheint dieselbe zu sein, selbst wenn der Spieler die Rückwärtsdrehung beginnt.

Auch der Kreuzproduktvektor ändert die Richtung nur dann, wenn der Spieler die Drehung in CW-Richtung von der Standardposition startet, d. H. 12 Uhr.

Ich habe sehr wenig Erfahrung im Umgang mit Quaternions und Rotationen. Jede Hilfe wird sehr hilfreich sein. Vielen Dank !!!

Desired

Antwort

0

Verwenden http://docs.unity3d.com/ScriptReference/Vector3.Angle.html Funktion den Wert des Winkels zu erhalten. Sie sollten je nach Richtung einen positiven/negativen Wert erhalten.

Sie könnten dann die Rotation sperren, wenn das Zeichen nicht die richtige Richtung ist, die Sie möchten.

+0

Ich habe es versucht. Es ist die gleiche Sache, die mich blockiert, die Richtung des Winkels zwischen den zwei Vektoren VERRINGERT. Das Vorzeichen ändert sich nur, wenn Sie die Drehung in CW von der Ref-Position, d. H. 12 Uhr, starten. – UnixNoob

+0

Hier ist ein Snapshot des Debug Logs http://s3.postimg.org/87vpcgpgz/Untitled.png – UnixNoob

+0

Verwenden Sie den richtigen Vorwärts-/Aufwärtsvektor? Sie können versuchen, sie mit der Debug.DrawLine-Funktion zu visualisieren und zu sehen, ob alles in Ordnung ist. – radonthetyrant

0

Ich habe es geschafft, eine Lösung zu obiger Frage herauszufinden. Hier stelle ich meine Lösung für den Fall, dass jemand in einer ähnlichen Situation in Zukunft stolpert.

void OnMouseDrag() 
{ 

    transform.Rotate(new Vector3(0,0, Mathf.Sqrt(Input.GetAxis("Mouse X") * Input.GetAxis("Mouse X") + Input.GetAxis("Mouse Y") * Input.GetAxis("Mouse Y")))); 

/*  
    Vector3 mousePos = Input.mousePosition; 
    mousePos.z = 5.23f; 

    Vector3 objectPos = Camera.main.WorldToScreenPoint(transform.position); 
    mousePos.x = mousePos.x - objectPos.x; 
    mousePos.y = mousePos.y - objectPos.y; 

    print("Angle is :"); 
    print(Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg - 90f); 

    if (counter_clockwise) 
    { 
     if (Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg - 90f > 0) 
     { 
      angle = Mathf.Max(angle, Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg - 90); 
      transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle)); 
     } 


     if (Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg - 90f < 0) 
     { 
      angle = Mathf.Max(angle, 360 + (Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg - 90)); 
      transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle)); 
     } 
    }    
*/ 
     glow_color.a = 1f; 
     child_yellowglow.color = glow_color;       
} 

Ich gründe die Richtung bools aus dieser Verwendung:

void OnMouseDown() 
{ 
    Vector3 mouseDragStartPos = Input.mousePosition; 

    print("Mouse pos: " + mouseDragStartPos); 
    print(" ref_vector" + ref_vector); 

    if (mouseDragStartPos.x < ref_vector.x) 
    { 
     clockwise = false; 
     counter_clockwise = true; 
     print("Left !!!"); 
    } 

    if (mouseDragStartPos.x >= ref_vector.x) 
    { 
     clockwise = true; 
     counter_clockwise = false; 
     print("Right !!!"); 
    } 
} 

hoffe, das hilft !!!

Verwandte Themen