2

openglとをいじっているだけglutです。私は立方体を完全に見えるようにしようとしていたので、私はそれを作ることができると決めたので、gluPerspective(); ここにコードがあります

#include <iostream>
#include <GL/glut.h>
#include <GL/gl.h>

using namespace std; 

float _angle = 0.1f;

void render(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();      

    gluPerspective(90.0, 1, 0.1, 100.0); 
    gluLookAt(1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

    glPushMatrix();  
      glRotatef(_angle, 0.0f,0.0f,1.0f);
      glColor3f(1.0f,0.0f,0.0f);
      glutSolidCube (1.0);
    glPopMatrix();
    _angle +=0.03f; 

    // check OpenGL error
    GLenum err;
    while ((err = glGetError()) != GL_NO_ERROR) {
        cerr << "OpenGL error: " << err << endl;
    }

   glutSwapBuffers();
   glutPostRedisplay();


}

void init(){
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("test");
    glClearColor(0.2,0.2,0.2,0.0);

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glutDisplayFunc(render);

    glutMainLoop();
}


int main(int argc, char * argv[]) {

    glutInit(&argc, argv);
    init();
    return 0;
}

そしてそれが結果です:

ここに画像の説明を入力

なしで立方体の一部がどのように見えるかgluPerspective(): ここに画像の説明を入力

普通に見えるようにするにはどうしたらいいですか?

4

1 に答える 1

3

投影行列をいじると、巻き方向が逆になるのと同じように、法線が逆になるとは必ずしも言えません。

OpenGL は、投影後に前面/背面のポリゴンをカリングするために使用されるポリゴン ワインディングを決定します。射影マトリックスとモデル ビュー マトリックスが、Z が向くべき方向 (つまり利き手) について一致しない場合、これらの奇妙な種類の問題が発生します。

伝統的に、射影行列は、OpenGL でモデルビュー行列を乗算すると、Z を反転するように設定されます。固定関数パイプラインは常にこのように機能しており、これが OpenGL の右手座標系を生成するものです。Z 座標を反転すると、投影後に頂点が巻き付けられる方向が変わります。

そうは言っても、これは実際にはあなたの問題ではないと思います。ここでは頂点ごとのライティングを使用しており、モデルビュー マトリックスと投影マトリックスを組み合わせています。頂点ごとの照明計算を行うときが来ると、それらは間違った座標空間で行われています。モデルビューをプロジェクションから分離することをお勧めします...

glMatrixMode   (GL_PROJECTION);
glLoadIdentity ();

gluPerspective (90.0, 1, 0.1, 100.0);

glMatrixMode   (GL_MODELVIEW);
glLoadIdentity ();      

gluLookAt      (1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

これで、変換マトリックスが適切に分離され、とりわけ固定機能ライティングが期待どおりに機能するはずです。

アップデート:

上で説明したことに加えて、もう 1 つ忘れていることがあります。OpenGL ではデプス テストはデフォルトで無効になっています (デプス バッファがあるという保証がないため)。有効にする必要があります。

glEnable (GL_DEPTH_TEST);

また、 を呼び出したときにアスペクト比が正しく設定されていgluPerspective (...)ませ640.0f/480.0f1

于 2013-09-28T21:07:02.470 に答える