首页 文章

实时限制旋转方向

提问于
浏览
0

有一个时钟的手,玩家一旦开始旋转(拖动)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

    使用http://docs.unity3d.com/ScriptReference/Vector3.Angle.html函数获取角度的值 . 您应该根据方向获得正/负值 .

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

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

    希望这可以帮助 !!!

相关问题