对象Unity的旋转以错误的值旋转

Dav*_*ave 6 c# rotation unity-game-engine

我的问题是我希望能够旋转一个圆柱9次.360/9是40所以我应该做的就是旋转40度9次.然而,这不起作用,因为当我第一次旋转圆柱而不是旋转40度它旋转39.99度时.这也发生在其他轮换中.

我正在这样做.

if(Input.GetKeyUp("i"))
      transform.GetChild(m_Section).Rotate(0,40.0f,0);
Run Code Online (Sandbox Code Playgroud)

我有统一版本3.4它不是专业版我在C#编码.

任何帮助,因为我刚开始尝试学习团结.

Kay*_*Kay 1

Unity3D 将旋转存储在一种非常抽象的数学表示形式中,称为四元数。欧拉角(您在 Unity 编辑器中看到的内容)的转换涉及一系列三角函数,因此容易出现舍入错误,尤其是对于简单的浮点类型。

\n\n

为了在您的情况下解决这个问题,我建议在开始旋转之前存储初始四元数对象,并在过程结束时设置它。一些伪代码:

\n\n
public class RotationController : MonoBehaviour {\n    Quaternion rotationAtStart;\n    int numOfRotations = 0;\n\n    void rotate () {\n        numOfRotations++;\n        if (numOfRotations == 1) {\n            rotationAtStart = transform.rotation;\n        } else if (numOfRotations < 9) {\n            transform.Rotate (new Vector3 (0,40.0f,0));\n        } else if (numOfRotations == 9) {\n            transform.rotation = rotationAtStart;\n        }\n    }\n    void Update () {\n        if (numOfRotations < 9) {\n            rotate ();\n        }\n    }\n }   \n
Run Code Online (Sandbox Code Playgroud)\n\n

360\xc2\xb0的特殊情况使得这种方法稳定。对于小于 360\xc2\xb0 的情况,您必须忍受较小的舍入误差。对于这种情况,我建议计算目标四元数Quaternion.RotateTowards并在最后一步中将其设置为类似于 360 度情况。

\n\n

另一个对你有用的东西是动画。您可以将动画定义为平滑或离散步骤,并GameObject.animation.Play("MyRotation")在按下“i”时调用。在最后使用 AnimationEvent 来获取动画何时终止的通知。

\n\n

最后,Mathf 包含了一个approximation函数来处理浮点不精确的问题。

\n