我在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;
}
这看起来很优雅而且快速,但是我不明白这是如何工作的。为什么可以限制一个自由度?
答案 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
的旋转。