您的四元数乘法中有符号错误。
public Quaternion times(Quaternion q2) {
Quaternion q1 = this;
float w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
float x = q1.x*q2.w + q1.w*q2.x + q1.z*q2.y - q1.y*q2.z;
float y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
float z = q1.w*q2.z - q2.x*q2.y + q1.y*q2.x + q1.z*q2.w;
return new Quaternion(w, x, y, z);
}
写出来的产品是
(w1 + x1*i + y1*j + z1*k)*(w2 + x2*i + y2*j + z2*k)
= w1*w2 - x1*x2 - y1*y2 - z1*z2
+ (w1*x2 + x1*w2 + y1*z2 - z1*y2)*i
+ (w1*y2 - x1*z2 + y1*w2 + z1*x2)*j
+ (w1*z2 + x1*y2 - y1*x2 + z1*w2)*k
自从
i*j = k j*i = -k
j*k = i k*j = -i
k*i = j i*k = -j
你在方程中有一个减号的错误术语x
和z
- 如果两个轴相同,那不会有什么不同,因为你也可以写(作为速记)
(r + v)*(s + w) = r*s - <v|w> + r*w + s*v + v×w
对于共线向量,v×w = 0
但如果轴不同,它会显示出来。
此外,在等式中z
,
float z = q1.w*q2.z - q2.x*q2.y + q1.y*q2.x + q1.z*q2.w;
^^^^^^^^^
你有一个错字,q2
对这两个因素都使用一次。
它应该是
public Quaternion times(Quaternion q2) {
Quaternion q1 = this;
float w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
float x = q1.x*q2.w + q1.w*q2.x - q1.z*q2.y + q1.y*q2.z;
float y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
float z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w;
return new Quaternion(w, x, y, z);
}