基于具有四元数的父对象定向对象?

时间:2015-03-13 19:13:47

标签: c++ quaternions

我在3D空间中有2个物体,A& B,对象B是A的父级。

两个对象都有3D位置,以及表示其特定方向的四元数。

我的翻译工作正常,所以每当A移动时,B就会移动。

但是,我似乎无法从父级获取正确应用于其子级的方向。

让我们说A的方向代表围绕X轴的90度旋转。使用我的代码,对象B似乎因某种原因旋转180度。

这是一张确切发生了什么的图片。

A is on the left, B is on the right

考虑到孩子和父母的位置和方向,我试图为任何特定的顶点生成一个向量:

vec4 finalVertex = rotVertexByQuat(parentOrientation, vec4(parentPos,1) +  vec4(objPos,1) + rotVertexByQuat(objOrientation, vertex) );

我按照这种方式用四元数旋转顶点:

vec4 rotVertexByQuat(Quaternion quat, vec4 vert)
{
    Quaternion p1 = Quaternion(1, vec3(vert.x,vert.y,vert.z));
    Quaternion p2 = multiplyQuaternion(quat,p1);
    Quaternion p3 = multiplyQuaternion(p2, inverseQuaternion(quat));
    return vec4(round(p3.v.x), round(p3.v.y), round(p3.v.z),1);
}

我的操作顺序是否有问题?

1 个答案:

答案 0 :(得分:1)

请参阅this question的答案。

我感觉你要实现的是Quaternion-Vector旋转操作。 Quaternion惯例有许多不同的,模糊的组合可能毁了你的一天(见this paper)。 如果您的旋转操作不起作用,请尝试:

V_inertial = q (x) V_body (x) q*

其中(x)是四元数乘法运算符,q *是q的共轭四元数。

此外,您的“堆叠”四元数可能是:

q_C = q_A (x) q_B
or 
q_C = q_B (x) q_A

取决于使用的惯例。