1

現在、マウスをドラッグして回転させる必要がある 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());

私が間違っていることを誰かが知っていますか?

4

1 に答える 1