c# - 对象Unity的旋转以错误的值旋转

标签 c# rotation unity3d

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

我正在这样做。

if(Input.GetKeyUp("i"))
      transform.GetChild(m_Section).Rotate(0,40.0f,0);

我有 unity 3.4 版本,它不是专业版,我正在用 C# 编写代码。

感谢任何帮助,因为我刚刚开始尝试学习 unity。

最佳答案

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

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

public class RotationController : MonoBehaviour {
    Quaternion rotationAtStart;
    int numOfRotations = 0;

    void rotate () {
        numOfRotations++;
        if (numOfRotations == 1) {
            rotationAtStart = transform.rotation;
        } else if (numOfRotations < 9) {
            transform.Rotate (new Vector3 (0,40.0f,0));
        } else if (numOfRotations == 9) {
            transform.rotation = rotationAtStart;
        }
    }
    void Update () {
        if (numOfRotations < 9) {
            rotate ();
        }
    }
 }   

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

另一个对你有用的东西是Animations .您可以将动画定义为平滑的或离散的步骤,如果按下“i”,则只需调用 GameObject.animation.Play("MyRotation")。在结束时使用 AnimationEvent 以在动画终止时得到通知。

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

关于c# - 对象Unity的旋转以错误的值旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8458679/

相关文章:

c# - ASP.NET Core 2.0 Web API Azure Ad v2 token 授权不起作用

c# - 从索引中排除属性

c++ - 使用 boost 几何旋转多边形

c# - 动态数据的正确数据类型?

c# - 逗号或分号分隔的自动完成文本框

c# - 如何向 Silverlight 客户端公开 .Net 2.0 Web 服务?

wpf - 旋转后 XAML 图像适合父级

html - 在另一个内部旋转 div 元素

unity3d - 我可以在 Unity3d 2017.2 中使用 Java 脚本语言吗?

c# - Unity3d - 在播放模式下加载特定场景