3

(也许这对于数学堆栈交换更好?)

我有一条由骨头组成的链条。每根骨头都有一个带尖和尾巴的。以下代码在给定旋转的情况下计算其尖端的位置,并适当地设置链位置中的下一个链接:

    // Quaternion is a hand-rolled class that works correctly (as far as I can tell.)
    Quaternion quat = new Quaternion(getRotationAngleDegrees(), getRotation());

    // figure out where the tip will be after applying the rotation
    Vector3f rotatedTip = quat.applyRotationTo(tip);

    // set the next bone's tail to be at this one's tip
    updateNextPosFrom(rotatedTip);

如果旋转应该围绕对象坐标系的原点发生,则此方法有效。但是,如果我希望围绕对象中的其他任意点进行旋转怎么办?我不确定如何翻译四元数。最好的方法是什么?

(我正在使用 JOGL / OpenGL。)

4

5 回答 5

5

对偶四元数对于表达刚性空间变换(组合旋转和平移)很有用。

基于对偶数(克利福德代数之一,d = a + eb,其中 a,b 是实数,e 不等于 0 但 e^2 = 0),对偶四元数 U + e V 可以用U 单位方向四元数和 V 关于参考点的力矩。这样,双四元数线与 Pluecker 线非常相似。

虽然四元数变换 QVQ*(Q* 是 Q 的四元数共轭)用于围绕一个点旋转单位向量四元数 V,但可以使用类似的对偶四元数形式来应用线螺旋变换(围绕一个点的刚性旋转)轴与沿轴的平移相结合。)

就像任何刚性 2D 变换都可以解析为围绕一个点的旋转一样,任何刚性 3D 变换都可以解析为螺旋。

对于这样的力量和表现力,双四元数引用很少,维基百科的文章是一个很好的起点。

于 2012-11-28T17:16:02.687 回答
4

四元数专门用于处理旋转因子,但根本不包括平移。

通常,在这种情况下,您需要根据“骨骼”长度对点应用旋转,但以原点为中心。然后,您可以将旋转后转换到空间中的适当位置。

于 2010-10-21T17:12:53.740 回答
4

四元数通常仅用于表示旋转;它们也不能代表翻译。

您需要将四元数转换为旋转矩阵,将其插入标准 OpenGL 4x4 矩阵的适当部分,并将其与平移结合以围绕任意点旋转。

4x4 rotation matrix:
  [ r r r 0 ]
  [ r r r 0 ]  <- the r's are the 3x3 rotation matrix from the wiki article
  [ r r r 0 ]
  [ 0 0 0 1 ]
于 2010-10-21T21:41:42.273 回答
3

关于正向运动学的维基百科页面指向这篇论文:同质变换和机器人运动学简介

于 2010-10-21T17:32:00.120 回答
0

编辑:这个答案是错误的。它论证了 4x4 变换矩阵的属性,这些属性不是四元数......

我可能弄错了,但对我来说(与某些答案不同),四元数确实是一种处理旋转和平移(以及更多)的工具。它是一个 4x4 矩阵,其中最后一列代表翻译。使用矩阵代数,将 3 向量 (x, y, z) 替换为 4 向量 (x, y, z, 1) 并通过矩阵计算变换后的向量。您会发现矩阵最后一列的值将添加到原始向量的坐标 x、y、z 上,就像在平移中一样。

3D 空间的 3x3 矩阵表示线性变换(如绕原点旋转)。您不能将 3x3 矩阵用于像平移这样的仿射变换。因此,我将四元数简单地理解为使用矩阵代数表示更多种类的变换的一个小“技巧”​​。诀窍是添加等于 1 的第四个坐标并使用 4x4 矩阵。因为矩阵代数仍然有效,所以可以通过将矩阵相乘来组合空间变换,这确实很强大。

于 2015-02-10T14:16:37.447 回答