1

シンプルな3Dシーンを表現した勉強プロジェクトがあります。原点以外の点に球を描きたい。後で、これを個別の関数またはメソッドとして実装します。

を使用して視点を設定し、オフセットをほとんど使用せずに球を描画してgluLookAt()モデルビューマトリックスを変換しています。glTranslatef()残念ながら、球は表示されません。モデルビューマトリックスが近づいていますか?

void display(void){    
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0);    
    glColor3b(197, 96, 63);    
    glPushMatrix(); 
    glLoadIdentity();
    glTranslatef(0.1, 0, 0);
    glutWireSphere(0.2, 20, 10);
    glPopMatrix();     
    glFlush();
}

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho ((float)w/(float)h, (float)-w/(float)h, -1, 1, 0.8, 100);
    glMatrixMode(GL_MODELVIEW);
}
4

2 に答える 2

3

いいえ、違います。

gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0); 
glColor3b(197, 96, 63);    
glPushMatrix(); 
glLoadIdentity(); // why it should be there?

そこでビューマトリックスをゼロにすることで、glLookAtを考慮せずに、原点座標を基準にしてオブジェクトを描画します。それへの呼び出しは事実上無視されます。次のようにコーディングする必要があります。

  1. 「カメラマトリックス」を設定する
  2. マトリックスをスタックにプッシュします
  3. オブジェクトの位置に移動します
  4. オブジェクトを描画します
  5. ポップして2に戻ります。

したがって、架空の「カメラ」を設定する場合は、オブジェクトの位置をカメラマトリックス自体と組み合わせる必要があります。

于 2013-02-28T13:02:16.020 に答える
1

あなたのアプローチはそれほど不合理に見えません。問題はここにあります:

glPushMatrix(); 
glLoadIdentity();
glTranslatef(0.1, 0, 0);

プッシュ(および後でポップ)することは良い考えですが、変換の前にマトリックスを同一性に設定することにより、以前に行われた変換、特にで確立された表示変換を失うことになりgluLookAtます。したがって、これを削除しglLoadIdentityて、個々の変換を適切に連結します。

glTranslate、などのすべての行列変換関数glOrtho、またはgluLookat現在選択されている(with)行列を常に変更し、glMatrixMode単にそれを置き換えるのではないことを常に念頭に置いてください。glLoadIdentityこれは、とへの呼び出しの前にを行う理由でもありglOrthoますgluLookAt

于 2013-02-28T13:06:57.787 に答える