2011-10-29 11 views
10

は、私は、キーを介して回転するオブジェクトを持っています。オブジェクトはヨー、ピッチ、ロールでなければなりません。多くを試した後、glRotateには限界があり、そのような機能を実装することはできません。四元からOpenGLの回転に

私は少しを調査し、四元ベースの回転を知ったしました。回転行列を介して回転することも可能ですが、ほぼすべての人が四元数を最良のものとして記述します。

私は四元について読むとかなりよくそれらを理解し、私のOpenGLプログラムでそれらを実装する方法をしているが、まだ謎です。誰かが小さな例を知っていますか?クォータニオンクラスの実装方法ではなく、どのように使用するか。私は一緒に物事をまとめる方法を取得しません。

+0

一度に複数の質問をするのはおすすめしません。私はあなたの[新しい質問](http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right)からここにリンクしています。 – Kev

答えて

4

最も重要なのは、四元から回転行列を構築する方法を実装することです:)完了です。次に、通常の回転行列で行うように、modelview行列に乗算するだけです。

これは、マウスの動きとキューブを回転させるために使用した簡単な例です。ご覧のとおり、私はtoMatrix,quaternionFromAxis,multiplyWithの3つのメソッドを実装する必要がありました。四元数を理解していると仮定すると、これは彼らが何をしているのかを明確にするはずです。

void display() { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glPushMatrix(); 

    // Multiply quaternion with current modelview matrix  
    glMultMatrixf(cameraQuaternion.toMatrix()); 

    // Some other transformations 
    glTranslatef(-0.5f, -0.5f, -0.5f); 

    // Draw something, i.e. cube 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 

    glPopMatrix(); 
} 

void mouseMoved(float dx, float dy) { 
    float axisY[] = { 0, 1, 0 }, 
      axisX[] = { 1, 0, 0 }; 

    float sensitivity = 0.005f; 
    Quaternion *q1 = Quaternion.quaternionFromAxis(axisY, dx * sensitivity]; 
    Quaternion *q2 = Quaternion.quaternionFromAxis(axisX, dy * sensitivity]; 

    // Multiply two quaternions with camera 
    cameraQuaternion = (q1.multiplyWith(q2)).multiplyWith(cameraQuaternion); 
} 
+0

カメラクォータニオンの初期値はどうすればよいですか? –

9

あなたは簡単にbuild rotation matrices out of unit quaternionsことができます。

は単位四元 を考える+ BI +のCJ + DK、あなたは以下の3×3行列構築することができます:

The matrix

が身元の4x4の行列、glMultMatrixから取られた最後の行や列を追加すると、あなたは