翻译四元数

时间:2010-10-21 17:07:48

标签: opengl graphics jogl quaternions

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

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

    // 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。)

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

您需要convert your quaternion into a rotation matrix,将其插入标准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 ]

答案 2 :(得分:3)

答案 3 :(得分:3)

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

基于双数(Clifford代数之一,d = a + eb,其中a,b为实数且e不等于零但e ^ 2 = 0),双四元数U + e V可表示线在空间中,U单位方向四元数和V表示参考点的时刻。通过这种方式,双四元数线非常像Pluecker线。

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

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

对于这种力量和表现力,双四元数引用很薄,而Wikipedia article就像开始一样好。

答案 4 :(得分:-1)

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

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

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