C# 为什么四元数。从旋转(旋转*轴,轴)*旋转限制一个自由度?
我在Unity插件最终IK中遇到了这行代码 整个功能是这样的:C# 为什么四元数。从旋转(旋转*轴,轴)*旋转限制一个自由度?,c#,unity3d,math,quaternions,C#,Unity3d,Math,Quaternions,我在Unity插件最终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; } 这看起来既优雅
//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;
}
这看起来既优雅又快速,但我无法理解它是如何工作的。为什么这可以限制一个自由度 直观地说,
FromToRotation()
部件正在还原除轴以外的轴上的任何旋转组件。它通过将旋转轴推回轴
来完成此操作
更详细地说:您希望找到一个旋转R1DOF
,该旋转接近R
,并且仅限于一个自由度(绕轴旋转
)。因此,您希望使用R
变换axis
可以保留axis
:
R1DOF * axis = axis
我在这里有点滥用符号,因为R
是一个四元数,四元数的转换不仅仅是一次乘法。让我们声明,*
是转换运算符
现在,我们将R1DOF
表示为M*R
,其中M
是将R*轴
映射到轴的修改旋转。为了清楚起见,让我们调用axisAfterR=R*axis
。如果我们这样做,那么:
R1DOF * axis = M * R * axis
= M * axisAfterR
由于我们定义了M
,从而将axisAfterR
映射到axis
,因此
= axis
这正是我们想要的
因此,轴(及其所有倍数)是R1DOF
的固定点。因此,R1DOF
是一个关于轴的旋转
谢谢你的回答,但是我不明白R1DOF*axis=axis
的意思,尽管有了证明,我如何从旋转(旋转*轴,轴)中得到答案*旋转
?R1DOF*轴=轴
意味着如果使用R1DOF
变换轴
,将得到轴
。你问题的第二部分指的是什么答案<代码>四元数。从旋转(旋转*轴,轴)
就是我在回答中所说的M
。R1DOF*轴=轴意味着如果你用R1DOF变换轴,你将得到轴
。。。R1DOF
不是垂直于轴的旋转吗?如何通过使用R1DOF
转换axis
来获取axis
?哦,我知道!限制一个自由度可视为在应用旋转后固定轴!所以这是有意义的。在这里使用“摆动扭曲分解”更优雅。