【问题标题】:Orienting an object based on a parent with quaternions?基于具有四元数的父对象定向对象?
【发布时间】:2015-03-13 19:13:47
【问题描述】:

我在 3D 空间中有 2 个对象,A 和 B,对象 B 是 A 的父对象。

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

我的翻译工作正常,所以只要 A 移动,B 就会移动。

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

假设 A 的方向表示围绕 X 轴旋转 90 度。使用我的代码,由于某种原因,对象 B 似乎旋转了 180 度左右。

这是正在发生的事情的图片。

在给定子节点和父节点的位置和方向的情况下,我尝试为任何特定顶点生成向量:

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);
}

我的操作顺序有问题吗?

【问题讨论】:

    标签: c++ quaternions


    【解决方案1】:

    查看this question的答案。

    我感觉您要实现的是四元数向量旋转操作。 有许多不同的、晦涩难懂的四元数约定组合可能会毁了你的一天(请参阅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
    

    取决于使用的约定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2018-07-24
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多