基于具有四元数的父对象定向对象?
Orienting an object based on a parent with quaternions?
我有 2 个 3D 对象 space,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);
}
我的操作顺序有问题吗?
查看 的答案。
我感觉你要实现的是四元数向量旋转操作。
有许多不同的、模糊的四元数约定组合可能会毁了你的一天(参见 this paper)。
如果您的旋转操作不起作用,请尝试:
V_inertial = q (x) V_body (x) q*
其中(x)是四元数乘法运算符,q*是q的共轭四元数。
此外,您的 "stacked" 四元数可能是:
q_C = q_A (x) q_B
or
q_C = q_B (x) q_A
取决于使用的约定。
我有 2 个 3D 对象 space,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);
}
我的操作顺序有问题吗?
查看
我感觉你要实现的是四元数向量旋转操作。 有许多不同的、模糊的四元数约定组合可能会毁了你的一天(参见 this paper)。 如果您的旋转操作不起作用,请尝试:
V_inertial = q (x) V_body (x) q*
其中(x)是四元数乘法运算符,q*是q的共轭四元数。
此外,您的 "stacked" 四元数可能是:
q_C = q_A (x) q_B
or
q_C = q_B (x) q_A
取决于使用的约定。