Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么四元数。从旋转(旋转*轴,轴)*旋转限制一个自由度?_C#_Unity3d_Math_Quaternions - Fatal编程技术网

C# 为什么四元数。从旋转(旋转*轴,轴)*旋转限制一个自由度?

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; } 这看起来既优雅

我在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;
}

这看起来既优雅又快速,但我无法理解它是如何工作的。为什么这可以限制一个自由度

直观地说,
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
?哦,我知道!限制一个自由度可视为在应用旋转后固定轴!所以这是有意义的。在这里使用“摆动扭曲分解”更优雅。