0

.obj 形式から 3D モデルを読み込もうとしていますが、問題なく画面にオブジェクトを描画しますが、画面のサイズを変更するとすべてが消えます。コードは次のとおりです。

Obj* object = new Obj();
GLuint  texture[1]; 

void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(double)w / (double)h,1.0,200.0);
}
void initRendering() {
object->GetObj("cube.obj");
glShadeModel(GL_LINEAR);                            
glClearColor(0.0f, 0.0f, 0.0f,     0.5f);                           
glEnable(GL_DEPTH_TEST);
}
void handleKeypress(unsigned char key, int x, int y) {
switch (key) {
    case 27:
        {
        exit(0);
        break;
        }
}
}

void drawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();
glPushMatrix();
glRotatef(45.0,0.0,1.0,0.0);
object->DrawObj();
glPopMatrix();
glutSwapBuffers();
glFlush();

}
int _tmain(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);


glutCreateWindow("3D");
initRendering();

glutReshapeFunc(handleResize);
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutMainLoop();
return 0;
}

Obj.DrawObj() のコードは次のとおりです。

glBegin(GL_TRIANGLES);
for(int i = 0;i < faces.capacity()-1;i++)
{
        glVertex3f(vertices[faces[i].vertex1].cordinate1,vertices[faces[i].vertex1].cordinate2,vertices[faces[i].vertex1].cordinate3);
    glVertex3f(vertices[faces[i].vertex2].cordinate1,vertices[faces[i].vertex2].cordinate2,vertices[faces[i].vertex2].cordinate3);
      glVertex3f(vertices[faces[i].vertex3].cordinate1,vertices[faces[i].vertex3].cordinate2,vertices[faces[i].vertex3].cordinate3);  
}
glEnd;
4

2 に答える 2

1

In your drawing code you set the projection matrix, which is good. However you set it to identity. In the resize handler you're setting the projection matrix as well, but you shouldn't do it there; yes I know the tutorials have it all there, but this is very bad style. You should move all the code currently in the reshape handler into the drawing handler, replacing the current setting of the projection matrix.

于 2012-05-26T07:47:18.223 に答える
1

PasteBin を読むと、まだ混乱していることがわかります。説明してみましょう:

オブジェクトを初めて描画したときにオブジェクトが表示されるのは、射影行列を設定していないためです。したがって、オブジェクトは正規化されたデバイス座標 (-1 から 1 の範囲) で直接描画されます。

サイズを変更すると、初めて射影行列が設定されます。これにより、画面に描画される表示領域が変更されます。最初に描画されたオブジェクトは、投影行列によって定義された表示領域の外側にあります (カメラの上にあり、ニアプレーンの前にあると思います。オブジェクトをカメラから遠ざけるように移動する必要があります)。視錐台の中にあります.これはdatenwolfが示唆していたことです.

ただし、同時にコードに他のエラーを導入しました。特に、handleResize で射影行列のリセットを停止しました。gluPerspective を呼び出す前に、常に射影行列をクリアする必要があります。そうしないと、偽の結果が得られます。

ペーストビンから正確なコードを取得し、glLoadIdentity を handleResize に追加すると、次のように動作するはずです。

void handleResize(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);   //<--- add
    glLoadIdentity();              //<--- add
    gluPerspective(45.0,(double)w / (double)h,1.0,200.0);
} 

また、drawScene 関数の実行中に射影行列をまだクリアしています。マトリックスをクリアすると、handleResize で設定したばかりのパースペクティブ設定が破棄されます。これは望ましくありません。

だから基本的に:

  1. handleResize および初期化時に射影行列を設定する
  2. drawScene で射影行列に触れないでください
  3. 視錐台に収まるようにオブジェクトを移動します。
于 2012-06-08T20:15:56.560 に答える