实时限制旋转方向

时间:2016-04-17 01:57:59

标签: unity3d rotation

有一个时钟牌,玩家一旦开始旋转(拖动)CCW直到他完成一整圈。 (没有提升阻力)

当玩家开始旋转时,我试图将旋转锁定到仅CCW方向。我从以下链接获得了帮助:[检测方向] [1] @ BobBobson108

以下是实际发生的事情的GIF: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);
 }

我尝试调试交叉积的值,但即使在玩家开始向后旋转时,合成矢量的方向也似乎相同。

此外,只有当玩家从默认位置(即12点钟)开始沿CW方向旋转时,叉积矢量才会改变方向。

我在使用四元数和旋转方面的经验非常少。任何帮助都将非常有帮助。谢谢!!!

Desired

2 个答案:

答案 0 :(得分:0)

使用http://docs.unity3d.com/ScriptReference/Vector3.Angle.html函数获取角度值。你 应该获得正/负值,具体取决于方向。

如果符号不是您想要的正确方向,则可以锁定旋转。

答案 1 :(得分:0)

我设法找出了上述问题的解决方案。在这里,我发布我的解决方案,以防万一将来遇到类似情况。

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

我正在设定方向bools使用它:

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 !!!");
    }
}

希望这有帮助!!!