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度?
顺便问一下,如果问题不是这个,你有其他的解决办法吗?
我不知道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
。这比你现在得到的要好得多。