0

そのため、OpenGL/GLUT 環境で単一のオブジェクトを回転させようとしました。 SO などに関するいくつかの質問を行った、正しいコードのように見えるものを書きましたが、サイコロはありません。これを機能させる方法を知っている人はいますか?

PS: GLMatrixmode を Projection に変更しようとしましたが、黒い画面しか表示されません。glLoadIdentity() を使用しても同じことが起こります。これが私のレンダリングコードです

void display()
{
    preProcessEvents();
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(Camera::position.x, Camera::position.y, Camera::position.z,
              Camera::position.x+Math::sind(Camera::rotationAngles.x)*Math::cosd(Camera::rotationAngles.y),
              Camera::position.y+Math::cosd(Camera::rotationAngles.x),
              Camera::position.z+Math::sind(Camera::rotationAngles.x)*Math::sind(Camera::rotationAngles.y),
              0.0, 1.0, 0.0);
    glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);
    glVertex3f(-1, 0,-3);
    glColor3f(0, 1, 0);
    glVertex3f(0.0f, 2.0f,-3);
    glColor3f(0, 0, 1);
    glVertex3f(1.0f, 0.0f,-3);
    glEnd();

    glBindTexture(GL_TEXTURE_2D, tex->textureID);

    glBegin(GL_QUADS);

    glColor3f(1, 1, 1);

    glTexCoord2f(100, 100);
    glVertex3f(100,0,100);

    glTexCoord2f(-100, 100);
    glVertex3f(-100,0,100);

    glTexCoord2f(-100,-100);
    glVertex3f(-100,0,-100);

    glTexCoord2f(100,-100);
    glVertex3f(100,0,-100);

    glEnd();
    glBindTexture(GL_TEXTURE_2D, 0);

    object1.draw();

    glTranslatef(-10.0, 10.0, 0.0);
    glBindTexture(GL_TEXTURE_2D, tex2->textureID);
    gluQuadricTexture(quad,1);
    gluSphere(quad,10,20,20);
    glBindTexture(GL_TEXTURE_2D, 0);
//RELEVANT CODE STARTS HERE
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glRotatef(190, 0.0, 0.0, 1.0);
    glPopMatrix();

    glutSwapBuffers();
}
4

2 に答える 2

1

あなたは何を知ってglPushMatrixglPopMatrixますか?「現在の」マトリックスを保存および復元します。

回転をその中に囲み、実際の描画操作を行わずに行列を復元することにより、 で始まるコードのシーケンス全体//RELEVANT CODE STARTS HEREが完全に無意味になります。

プッシュ/ポップをしなかったとしても、回転は次に何かを描画するときにのみ適用されます。論理的には、次に を呼び出すときはそれを意味すると考えるかもしれませんがdisplay (...)、最初に行うことの 1 つはdisplay (...)、現在の行列を単位行列に置き換えることです (3 行目)。

正直なところ、現在 OpenGL の学習に使用しているリソースを放棄することを検討する必要があります。非推奨の機能を使用しており、いくつかの基本が欠けています。優れた OpenGL 3.0 チュートリアルでは、通常、変換行列の基本に触れています。


マトリックスモードをプロジェクションに変更すると黒い画面が生成される理由は、次回 を呼び出すと、プロジェクションマトリックスdisplay (...)で動作するためです。gluLookAt実際には、カメラ変換を 2 回適用することになります。これを避けるglMatrixMode (GL_MODELVIEW)には、 の先頭に追加する必要があります。display (...)

于 2014-10-26T20:38:15.010 に答える