我正在进行的项目需要一个模仿3ds / gmax四元数添加的功能。 (quat 1 2 3 4)+(quat 3 5 7 9)的测试用例应该相等(quat 20 40 54 2)。这些quats在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 * q.s - v * q.v是如何工作的。 s是浮点数,v是向量。乘以向量并添加到浮点数? 我甚至不确定这些值代表哪个方向/旋转/方向,但如果函数满足上面的quat值,它就会起作用。
答案 0 :(得分: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产生不同的结果,既不像加法也不是乘法。