我有两个四元数,例如:
w x y z
1: 0.98 0.08 0.17 -0.01
2: 0.70 0.70 0.0 0.0
我需要将它们相乘,得到第三个,其中包含所有旋转,但没有想法。如果 PHP / C++ / PAWN 中有一个函数来做这样的事情,那就太完美了。
我搜索了很多,但几乎没有找到让我理解的东西。
感谢您的回答。
我有两个四元数,例如:
w x y z
1: 0.98 0.08 0.17 -0.01
2: 0.70 0.70 0.0 0.0
我需要将它们相乘,得到第三个,其中包含所有旋转,但没有想法。如果 PHP / C++ / PAWN 中有一个函数来做这样的事情,那就太完美了。
我搜索了很多,但几乎没有找到让我理解的东西。
感谢您的回答。
你应该选择一种语言。在 C++ 中,Boost.Math 库包括四元数;我不知道你提到的其他语言。或者对于简单的乘法,您可以只使用乘法表(我从Wikipedia复制):
*| 1 i j k
-------------
1| 1 i j k
i| i -1 k -j
j| j -k -1 i
k| k j -i -1
For example, i*j
gives the value in row i
and column j
, which is k
.
So, assuming your quaternions represent w*1 + x*i + y*j + z*k
, multiplication would be something like
quaternion operator*(quaternion a, quaternion b) {
return {
a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z, // 1
a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y, // i
a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x, // j
a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w // k
};
}
(NOTE: that's untested, and probably riddled with typos).
好的,所以在wiki之后。
我会做类似的事情:
class Quaternion{
double w,x,y,z;
public:
Quaternion(double w, double x, double y, double z) : w(w), x(x), y(y), z(z) {};
operator*(const Quaternion& rhs){
double _w, _x, _y, _z;
//compute new values
_w = w*rhs.w - x*rhs.x - y*rhs.y - z*rhs.z;
_y = /* after wiki */;
_x = /* after wiki */;
_z = /* after wiki */;
//update values
w = _w; x = _x; y = _y; z = _z;
}
}
即用 4 个实数制作一个对象,编写一个运算符来计算新系数。
Expressing the imaginary xi+yj+zk
as a vector, the multiplication of Qc{Wc,Vc} = Qa{Wa,Va} * Qb{Wb,Vb}
is as follows:
Qc{Wc,Vc} = {WaWb + WaVb + WbVa + VaVb}
.
From VaVb = -(Va dot Vb) + (Va cross Vb)
[the former is a scaler and the latter is a vector], then grouping scalers and vectors:
Qc{Wc,Vc} = {WaWb + -(Va dot Vb), WaVb + WbVa + (Va cross Vb)}
.