質問

私は現在、マウスをドラッグして回転させる必要がある3Dシーンに取り組んでいます。これを行うために、私はArcBall実装を利用しています。

使用されたフレームワークは、すぐに結果の四元数を回転行列に変換しました。その後の回転も行列に変換されます。これらの行列は順番に乗算されます。

回転四元数を単純に乗算することでこれを最適化したかったのです。今、シーンは元のバージョンが大丈夫に働いている間に制御不能に回転しているようです(ish)。

四元数を乗算するための私のコード:

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());

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

役に立ちましたか?

解決

glMultMatrixf (...) を乗算します。 流れ あなたがそれを渡すものによって行列。今ここに物事が面白いのようなものを得る場所です、あなたは四元数を持っていること また、 累積的であるようです(名前付き currentRotation).あなたは2つの異なる場所で回転を蓄積しています。

チャンスは、あなたが何ですか 実際には 欲しいのは glLoadMatrixf (...).現在の行列に回転行列を乗算するのではなく、それは次のようになります 置換 マトリックス。あなたは呼び出すことによって同じ結果を達成することができます glLoadIdentity (...) 直前 glMultMatrixf (...);一番下の行は、これを適用する前に行列の古い回転を破棄する必要があることです。

GLの行列が更新されるたびにリセットされるような動作なのか、それとも四元数がリセットされるのかは明らかではありませんが、実際には2つのうちの1つをリセットする必要があります。そうしないと、無限に回転します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top