为什么Quaternion.FromToRotation(旋转*轴,轴)*旋转限制一个自由度?

时间:2018-07-07 14:00:50

标签: c# unity3d math quaternions

我在Unity插件Final IK中遇到了此行代码。

整个功能如下:

//Limits rotation to a single degree of freedom (along axis)

protected static Quaternion Limit1DOF(Quaternion rotation, Vector3 axis) 
{
  return Quaternion.FromToRotation(rotation * axis, axis) * rotation;
}

这看起来很优雅而且快速,但是我不明白这是如何工作的。为什么可以限制一个自由度?

1 个答案:

答案 0 :(得分:2)

直觉上,FromToRotation()部分正在还原围绕axis以外的轴的任何旋转分量。通过将旋转的轴推回到axis来完成此操作。

更多细节:您想找到一个旋转R1DOF,它接近R,并被限制在一个自由度内(围绕axis的旋转)。因此,您希望用axis转换R保留axis

R1DOF * axis = axis

由于R是一个四元数,而通过四元数进行的变换不仅仅是一个乘法,因此我在这里有点滥用。让我们改为声明*是转换运算符。

现在,我们将R1DOF表示为M * R,其中M是将R * axis映射到axis的修改旋转。为了清楚起见,我们将其称为axisAfterR = R * axis。如果我们这样做,那么:

R1DOF * axis = M * R * axis
             = M * axisAfterR

由于我们将M定义为将axisAfterR映射到axis,所以我们有了

             = axis

这正是我们想要的。

因此,axis(及其所有倍数)是R1DOF的固定点。因此,R1DOF是围绕axis的旋转。