0

我正在处理的一个项目需要一个模拟 3ds/gmax 的四元数加法的函数。(quat 1 2 3 4)+(quat 3 5 7 9) 的测试用例应该等于 (quat 20 40 54 2)。这些季铵盐在 xyzw 中。所以,我认为这是基本代数,给定干净的数字。它必须是这样的乘法函数,因为它不涉及 sin/cos:

    const quaternion &operator *=(const quaternion &q)      
    {
        float x= v.x, y= v.y, z= v.z, sn= s*q.s - v*q.v;
        v.x= y*q.v.z - z*q.v.y + s*q.v.x + x*q.s;
        v.y= z*q.v.x - x*q.v.z + s*q.v.y + y*q.s;
        v.z= x*q.v.y - y*q.v.x + s*q.v.z + z*q.s;
        s= sn;
        return *this;
    } 

资源

但是,我不明白 sn= s*qs - v*qv 应该如何工作。s 是浮点数,v 是向量。将向量相乘并添加到浮点数?我什至不确定这些值代表哪些方向/旋转/方向,但如果函数满足上面的 quat 值,它就会起作用。

4

1 回答 1

0

找到了。结果被称为乘法。加法是乘法。向上是横向的。一点也不混乱:/

fn qAdd q1 q2 = (
x1=q1.x
y1=q1.y
z1=q1.z
w1=q1.w
x2=q2.x
y2=q2.y
z2=q2.z
w2=q2.w

W = (W1 * W2) - (X1 * X2) - (Y1 * Y2) - (Z1 * Z2)
X = (W1 * X2) + (X1 * W2) + (Y1 * Z2) - (Z1 * Y2)
Y = (W1 * Y2) + (Y1 * W2) + (Z1 * X2) - (X1 * Z2)
Z = (W1 * Z2) + (Z1 * W2) + (X1 * Y2) - (Y1 * X2)

return (quat x y z w)

)

交换 q1 和 q2 会产生不同的结果,既不像加法也不像乘法。

资源

于 2012-12-23T21:49:52.283 回答