2012-01-10 31 views
0

OpenGLでカメラの回転機能を作成しようとしていますが、実行できません。私のカメラは、いくつかのマイナーな変更で、flipcodeから主に次のとおりです。glRotateを使用していないOpenGLのカメラの回転glLookAt

カメラコード:回転、私の問題に

void Camera::setView() { 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    float viewmatrix[16]={//Remove the three - for non-inverted z-axis 
          Transform[0], Transform[4], -Transform[8], 0, 
          Transform[1], Transform[5], -Transform[9], 0, 
          Transform[2], Transform[6], -Transform[10], 0, 

          -(Transform[0]*Transform[12] + 
          Transform[1]*Transform[13] + 
          Transform[2]*Transform[14]), 

          -(Transform[4]*Transform[12] + 
          Transform[5]*Transform[13] + 
          Transform[6]*Transform[14]), 

          //add a - like above for non-inverted z-axis 
          (Transform[8]*Transform[12] + 
          Transform[9]*Transform[13] + 
          Transform[10]*Transform[14]), 1}; 
    glLoadMatrixf(viewmatrix); 
} 

Camera::Camera(float x, float y, float z) { 
    memset(Transform, 0, 16*sizeof(float)); 
    Transform[0] = 1.0f; 
    Transform[5] = 1.0f; 
    Transform[10] = 1.0f; 
    Transform[15] = 1.0f; 
    Transform[12] = x; Transform[13] = y; Transform[14] = z; 

    Left=&Transform[0]; 
    Up=&Transform[4]; 
    Forward=&Transform[8]; 
    Position=&Transform[12]; 

    old_x = 0; 
    old_y = 0; 
} 

ビューは、すべてのレンダリングされたフレームの前に設定されています。例えば、y軸周りの回転を考える。これは、回転行列スタックです:私は回転機能を表示するつもりです

// deg is the angle it is not working in degree or radiant 
void Camera::rotateLocal_y(float deg){ 
    glMatrixMode(GL_MODELVIEW); 

    glPushMatrix(); 
    glLoadMatrixf(Transform); 

    rotateMatrixf_y(Transform, deg); 



    glGetFloatv(GL_MODELVIEW_MATRIX, Transform); 
    glPopMatrix(); 
} 

ので、次:

//rotate a matrix around y axis 
void rotateMatrixf_y(float *aMatrix, float angle){ 
    //         x     y    z      t 
    float rotMatrix[] = {cos(angle),0,-1*sin(angle),0, 0, 1, 0, 0, sin(angle), 0, cos(angle), 0, 0, 0, 0, 1}; 

    multMatrixMatrix(rotMatrix,aMatrix); 

} 

そして最後に行列乗算機能:

void multMatrixMatrix(float* m_a, float* m_b){ 
    float m_c[16] = {m_a[0]*m_b[0]+m_a[4]*m_b[1]+m_a[8]*m_b[2]+m_a[12]*m_b[3], 
        m_a[0]*m_b[4]+m_a[4]*m_b[5]+m_a[8]*m_b[6]+m_a[12]*m_b[7], 
        m_a[0]*m_b[8]+m_a[4]*m_b[9]+m_a[8]*m_b[10]+m_a[12]*m_b[11], 
        m_a[0]*m_b[12]+m_a[4]*m_b[13]+m_a[8]*m_b[14]+m_a[12]*m_b[15], 

        m_a[1]*m_b[0]+m_a[5]*m_b[1]+m_a[9]*m_b[2]+m_a[13]*m_b[3], 
        m_a[1]*m_b[4]+m_a[5]*m_b[5]+m_a[9]*m_b[6]+m_a[13]*m_b[7], 
        m_a[1]*m_b[8]+m_a[5]*m_b[9]+m_a[9]*m_b[10]+m_a[13]*m_b[11], 
        m_a[1]*m_b[12]+m_a[5]*m_b[13]+m_a[9]*m_b[14]+m_a[13]*m_b[15], 

        m_a[2]*m_b[0]+m_a[6]*m_b[1]+m_a[10]*m_b[2]+m_a[14]*m_b[3], 
        m_a[2]*m_b[4]+m_a[6]*m_b[5]+m_a[10]*m_b[6]+m_a[14]*m_b[7], 
        m_a[2]*m_b[8]+m_a[6]*m_b[9]+m_a[10]*m_b[10]+m_a[14]*m_b[11], 
        m_a[2]*m_b[12]+m_a[6]*m_b[13]+m_a[10]*m_b[14]+m_a[14]*m_b[15], 

        m_a[3]*m_b[0]+m_a[7]*m_b[1]+m_a[11]*m_b[2]+m_a[15]*m_b[3], 
        m_a[3]*m_b[4]+m_a[7]*m_b[5]+m_a[11]*m_b[6]+m_a[15]*m_b[7], 
        m_a[3]*m_b[8]+m_a[7]*m_b[9]+m_a[11]*m_b[10]+m_a[15]*m_b[11], 
        m_a[3]*m_b[12]+m_a[7]*m_b[13]+m_a[11]*m_b[14]+m_a[15]*m_b[15] 
    }; 

    m_b = m_c; 

} 

私は、この必須もののしかし、根本的に何かが間違っているように思えます。それはまったく動いていません。カメラは正しく設定されています。メソッドの順序は、cam.rotate、次にcam.setViewです。

Flipcodes originial回転機能は:

void Camera::rotateLoc(float deg, float x, float y, float z) { 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadMatrixf(Transform); 

    glRotatef(deg, x,y,z); 

    glGetFloatv(GL_MODELVIEW_MATRIX, Transform); 
    glPopMatrix(); 
} 
+0

なぜこれをやりたいですか? – Ali

+0

C++を使用しているので、ベクターや行列の計算にGLMを使用することを検討しましたか? –

+0

@ Ali:この方法で試してみたい。 xとyにglRotatefだけを使用すると、z軸回りの回転も発生しました。 @Martinho:いいえ – Knut

答えて

2

あなたのコードはかなり厄介かつ不完全です。

私はあなたの問題はここにあると思う:

glPushMatrix(); 
glLoadMatrixf(Transform);     // give the Transform matrix to GL (why?) 

rotateMatrixf_y(Transform, deg);    // modify the Transform matrix 

glGetFloatv(GL_MODELVIEW_MATRIX, Transform); // (3) retrieve the original Tranform matrix 
glPopMatrix(); 

(3)ちょうどあなたが「rotateMatrixf_y」を呼び出すことにより、「トランスフォーム」に行ってきた変更何でも元に戻します。

あなたが追加したフリップコードコードは、glRotatef 'を呼び出して結果を読み取ってOpenGLを使ってTranformマトリックスを更新しています。これは問題ありません。メソッドコードでは、OpenGLへの参照をすべて削除して、すべての作業を独自に行うrotateMatrixf_yを呼び出してください。

あなたは本当にGLマトリックススタックの使い方を理解していますか?おそらく、GL関数のみを使うか、自分のものを使うかのどちらかで基礎に戻るべきですが、用途を混ぜる前にどちらの方法で動作するのかを知る必要があります。

+0

そして、(3)すべてを元に戻さなかったとしても、最後の 'glPopMatrix'は終わるでしょう。 –

+0

@R。 Martinhoは 'rotateLocal_y'のセマンティクスに応じて、このメソッドが何をすべきか分かりませんが、' Transform'マトリックスを更新するだけの印象がありましたが、間違っている可能性があります。 – rotoglup

+0

@ R and M :IIはGlGetメソッドを削除しましたが、変更はありません。再押し/ポップ:glPushMatrixの前に、恒等行列がスタックにあります。それから私はプッシュを実行し、Transformマトリックスを保存します。恒等行列を使ってオブジェクトを描くためのポップが続きます。ビューを設定すると、私は直接Transformマトリックスを取ります。私はQuestionを編集しました。flipcodeの元の関数があります。これは動作していて、同じ関数呼び出しを持っていますが、rotate関数です。 – Knut

関連する問題