首页 > 解决方案 > 通过检查器窗口设置四元数

问题描述

我正在寻找一种通过检查器窗口设置四元数(x,y,z,w)的方法。当我们在 Unity 中单击“调试”模式时,我们会得到所有这些变量。通过 Unity 文档,我了解到这些值介于 0-1 之间。那么我们如何设置角度,例如 90,-90,180,-180,270,.... 这里主要是我想在这个游戏对象的脚本中设置目标旋转,以便游戏对象从初始旋转移动到目标回转。例如在“正常”窗口中,如果我将 x 的目标旋转设置为 180(在检查器窗口中显示为 -5.008956e-06),则游戏对象从 0 移动到 -180,而不是 +180。这就是我移至“调试”窗口的原因,认为这里设置它有帮助。但是这里的值介于 0-1 之间,那么有人知道如何计算吗?

此外,对于旋转,我正在使用这一行:

transform.localRotation = Quaternion.Slerp(transform.localRotation, targetRotation, Time.deltaTime * RotationSpeed);

在此处输入图像描述

标签: c#unity3d

解决方案


正如我在评论中所说,不要直接设置四元数,除非您对自己对它们的理解非常有信心,正如统一文档(强调我的)中所指出的那样。

它们基于复数,不容易直观理解。您几乎从不访问或修改单个四元数组件(x、y、z、w);大多数情况下,您只需获取现有的旋转(例如来自变换)并使用它们来构建新的旋转(例如在两个旋转之间平滑插值)。99% 的时间使用的四元数函数是:Quaternion.LookRotation、Quaternion.Angle、Quaternion.Euler、Quaternion.Slerp、Quaternion.FromToRotation 和 Quaternion.identity。(其他功能仅用于异国用途。)

相反,您想要做的是Vector3从检查器中将初始和目标旋转设置为 (Eulerangles),并使用内置Quaternion.Euler();方法让 Unity 计算出从 Eulerangles 到四元数的转换。

这看起来像这样(请注意,我在示例的更新中执行此操作,并使用time我从检查器更新的浮点数来更改旋转,这只是为了便于示例而不是最好的方法实现)的t参数Quaternion.Slerp

public Vector3 initialrotation;
public Vector3 targetRotation;
public float time;

void Update()
{
    // Let Unity figure out what the appropriate Quaternions are for the given Eulerangles
    // Note that this can better be done in Start if initialRotation and targetRotation never change. Just put it here for simplicity
    var initialQuaternion = Quaternion.Euler(initialrotation); 
    var targetQuaternion = Quaternion.Euler(targetRotation);

    var slerp = Quaternion.Slerp(initialQuaternion, targetQuaternion, time);
    transform.rotation = slerp;
}

推荐阅读