私が取り組んでいるプロジェクトでは、3ds/gmax のクォータニオンの追加を模倣する関数が必要です。(quat 1 2 3 4)+(quat 3 5 7 9) のテスト ケースは、(quat 20 40 54 2) と等しくなければなりません。これらの quat は 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 値を満たしている場合、機能します。