現在、マウスをドラッグして回転させる必要がある 3D シーンに取り組んでいます。これを行うために、ArcBall の実装を利用しています。
使用されたフレームワークは、結果の四元数をすぐに回転行列に変換しました。後続の回転も行列に変換されます。次に、これらの行列が乗算されます。
単純に回転クォータニオンを乗算することで、これを最適化したかったのです。元のバージョンは問題なく動作していましたが、シーンが制御不能に回転しているように見えます。
クォータニオンを乗算するための私のコード:
public static Quat4f mul(Quat4f q1, Quat4f q2) {
float x = q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x;
float y = -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y;
float z = q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z;
float w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w;
return new Quat4f(x,y,z,w);
}
乗算は次のように行われます (結果は適切な測定のために正規化されます)。
currentRotation = Quat4f.mul(newRotation, currentRotation);
最後に、回転は次のように適用されます。
glMultMatrixf(currentRotation.toMatrix());
私が間違っていることを誰かが知っていますか?