我试图了解四元数旋转是如何工作的,我发现了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-rotation/但他做了一些我无法锻炼的假设,比如我怎么能“计算出围绕每个轴的旋转矢量,只需围绕轴旋转矢量。 ”以及他如何计算 angleDegreesX、angleDegreesY 和 angleDegreesZ?
有人可以提供一个可行的例子或解释吗?
我试图了解四元数旋转是如何工作的,我发现了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-rotation/但他做了一些我无法锻炼的假设,比如我怎么能“计算出围绕每个轴的旋转矢量,只需围绕轴旋转矢量。 ”以及他如何计算 angleDegreesX、angleDegreesY 和 angleDegreesZ?
有人可以提供一个可行的例子或解释吗?
最短的可能总结是四元数只是旋转矩阵的简写。一个 4x4 矩阵需要 16 个单独的值,而一个四元数可以表示 4 中完全相同的旋转。
对于有数学倾向的人,我完全意识到上述内容过于简单化了。
为了提供更多细节,让我们参考维基百科的文章:
单位四元数提供了一种方便的数学符号,用于在三个维度上表示对象的方向和旋转。与欧拉角相比,它们更易于组合并且避免了云台锁定的问题。与旋转矩阵相比,它们在数值上更稳定并且可能更有效
从开头的段落中不清楚的是,四元数不仅方便,而且是独一无二的。如果您有一个对象的特定方向,在任意数量的轴上扭曲,则存在一个表示该方向的唯一四元数。
同样,对于数学倾向,我上面的唯一性评论假设右手旋转。有一个等效的左手四元数围绕相反的轴以相反的方向旋转。
为了简单解释的目的,这是没有区别的区别。
如果您想创建一个简单的四元数来表示绕轴旋转,这里有一系列简短的步骤可以帮助您实现:
v = {x, y, z}
。出于礼貌,请选择一个单位向量:如果它的长度不是 1,则将所有分量除以 v 的长度。theta
。四元数构造:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
sin(theta/2.0) * y, // These capture the axis of rotation
sin(theta/2.0) * z};
请注意这些除以二:确保轮换中没有混淆。对于正常的旋转矩阵,向右旋转 90 度与向左旋转 270 度相同。相当于这两个旋转的四元数是不同的:你不能将一个与另一个混淆。
编辑:回答评论中的问题:
让我们通过设置以下参考框架来简化问题:
因此,如果我们有一个示例对象(例如箭头),它从指向右侧(正 x 轴)开始。如果我们将鼠标从 x 轴向上移动,鼠标将为我们提供正 x 和正 y。因此,通过一系列步骤:
double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * 0, // As you can see, the zero components are ignored
sin(theta/2.0) * 0, // Left them in for clarity.
sin(theta/2.0) * 1.0};
你需要一些基本的数学来做你需要的事情。基本上,您可以通过将表示该点的矩阵与旋转矩阵相乘来围绕轴旋转一个点。结果是该点的旋转矩阵表示。
线
angleX = angleDegreesX * DEGTORAD;
只需通过一个简单的公式将度数表示转换为弧度表示(请参阅弧度上的这个维基百科条目)
您可以在此处找到有关旋转矩阵的更多信息和示例:绕任意轴旋转
您的编程框架中可能有一些工具可以完成旋转工作并检索矩阵。不幸的是,我无法帮助您处理四元数,但您的问题似乎更基本一些。