Unity3D的有界旋转

本文关键字:旋转 Unity3D | 更新日期: 2023-09-27 18:06:40

我想用左箭头键旋转一个对象,我想将旋转绑定到30度。我的代码是:

if (Input.GetKey(KeyCode.LeftArrow) && transform.localEulerAngles.z <= 30)
   transform.Rotate(0,0,1);

为什么旋转停止到31度?显然我的问题比这个更复杂,我有不同的边界,我需要精度。这个例子的原因是简单地说,如果以这种方式管理旋转是不精确的。

我认为原因是Unity3D内部使用四元数,作用于度只是一个近似值。我是正确的吗?在最后一种情况下,我该如何处理呢?

例如,我如何使用四元数在轴上旋转30度?

顺便问一下,如果问题不是这个,你有其他的解决办法吗?

Unity3D的有界旋转

我不知道unity如何管理旋转,但这里你的问题似乎更简单。

在if中使用'<='比较,当对象处于30度时,在if中输入最后一次时间并再旋转1度,使用'<'在合适的时刻停止

获取Start()函数中的当前旋转,然后使用它来查找将用于执行if语句的偏移量。应该这样做:

public GameObject gameObjectToRotate;
Vector3 defaultAngle;
float minRot = 30f;
float maxRot = 30f;
// Use this for initialization
void Start()
{
    defaultAngle = gameObjectToRotate.transform.eulerAngles;
}
// Update is called once per frame
void Update()
{
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        float offset = defaultAngle.z - gameObjectToRotate.transform.eulerAngles.z;
        //Check if we are within min, max rot
        if (offset < minRot && offset > -maxRot)
        {
            gameObjectToRotate.transform.Rotate(0, 0, 1);
            Debug.Log("Rotating!");
        }
    }
}

精度为30.016。这比你现在得到的要好得多。