Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++_Math_Unity3d_Rotation_Quaternions - Fatal编程技术网

C++ 使用四元数防止绕特定轴旋转

C++ 使用四元数防止绕特定轴旋转,c++,math,unity3d,rotation,quaternions,C++,Math,Unity3d,Rotation,Quaternions,我正在用鼠标为相机控件编程。我希望用户能够上下或左右查看,但不能“倾斜”到一侧。换句话说,我想允许偏航和俯仰改变,但将横摇限制为0 如何防止四元数绕某个轴旋转?当我只允许x轴旋转或y轴旋转时,一切正常,但当我同时允许x轴旋转或y轴旋转时,由于某种原因,y轴旋转受到影响,相机向一侧倾斜。正如CNuts所解释的,连接多个偏航和俯仰旋转可能会导致滚动旋转。但是,如果偏航和俯仰旋转按乘法顺序严格分开,则不会发生这种情况。例如 Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2 只

我正在用鼠标为相机控件编程。我希望用户能够上下或左右查看,但不能“倾斜”到一侧。换句话说,我想允许偏航和俯仰改变,但将横摇限制为0


如何防止四元数绕某个轴旋转?当我只允许x轴旋转或y轴旋转时,一切正常,但当我同时允许x轴旋转或y轴旋转时,由于某种原因,y轴旋转受到影响,相机向一侧倾斜。

正如CNuts所解释的,连接多个偏航和俯仰旋转可能会导致滚动旋转。但是,如果偏航和俯仰旋转按乘法顺序严格分开,则不会发生这种情况。例如

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2
只有在末端添加另一个偏航旋转时才会出现问题。但是,您可以很容易地防止这种情况:如果要添加偏航旋转,请将其向左乘以。如果要添加俯仰旋转,请将其向右乘以。即,如果当前摄像机旋转为
R
,则:

R = additionalYaw * R

由于所有偏航旋转都围绕同一轴,因此这些变换实际上是相互转换的。因此,它们以什么顺序出现并不重要(这同样适用于围绕同一轴的所有其他旋转)。当然,您也可以切换顺序(即先俯仰,然后偏航)。取决于你想要什么样的控制


CNuts还描述了另一种方法。如果有变换层次,则可以有两个节点用于摄影机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离围绕不同轴的旋转。

正如CNuts所解释的,串联多个偏航和俯仰旋转可导致滚转旋转。但是,如果偏航和俯仰旋转按乘法顺序严格分开,则不会发生这种情况。例如

Yaw1 * Yaw2 * Yaw3 * Pitch1 * Pitch2
只有在末端添加另一个偏航旋转时才会出现问题。但是,您可以很容易地防止这种情况:如果要添加偏航旋转,请将其向左乘以。如果要添加俯仰旋转,请将其向右乘以。即,如果当前摄像机旋转为
R
,则:

R = additionalYaw * R

由于所有偏航旋转都围绕同一轴,因此这些变换实际上是相互转换的。因此,它们以什么顺序出现并不重要(这同样适用于围绕同一轴的所有其他旋转)。当然,您也可以切换顺序(即先俯仰,然后偏航)。取决于你想要什么样的控制


CNuts还描述了另一种方法。如果有变换层次,则可以有两个节点用于摄影机变换。然后,将偏航旋转添加到其中一个,将俯仰旋转添加到另一个。这将具有与上述相同的效果,有效地分离绕不同轴的旋转。

这是由于在同一对象上添加偏航和俯仰而导致其滚动的常见问题。我不记得如何修复它,但你需要有一个对象作为父对象,并使该对象执行例如俯仰,然后应用到子对象或相反的偏航,我不太确定。如果在两个不同的对象上分离偏航和俯仰,它应该会起作用。似乎当你有两个四元数并组合它们时,你应该能够得到结果的四元数,将其轴投影到滚动轴上,并使用它来移除滚动组件。但这是一个即兴的回答,基于对所涉及的线性代数的直觉。这是一个常见的问题,因为在同一个物体上增加了偏航和俯仰,使其滚动。我不记得如何修复它,但你需要有一个对象作为父对象,并使该对象执行例如俯仰,然后应用到子对象或相反的偏航,我不太确定。如果在两个不同的对象上分离偏航和俯仰,它应该会起作用。似乎当你有两个四元数并组合它们时,你应该能够得到结果的四元数,将其轴投影到滚动轴上,并使用它来移除滚动组件。但这是一个基于对所涉及的线性代数的直觉的即兴回答。我希望我想到了四元数变换的非交换性质。非常好的答案。这就是我的问题的答案:非常感谢。我希望我想到了四元数变换的非交换性质。回答得很好。这就是我的问题的答案:非常感谢。