由于gluPerspercitve正常倒置?

时间:2013-09-28 20:44:32

标签: opengl glut normals glulookat

只是在使用openglglut时鬼混。我试图制作立方体完整的visibe所以我决定用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;
}

,结果是:

enter image description here

如果没有gluPerspective(),多维数据集的部分内容如何: enter image description here

我怎样才能让它看起来正常?

1 个答案:

答案 0 :(得分: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);

现在你已经正确地分离了转换矩阵和固定功能照明,其他事情应该按预期工作。

更新

除了我上面所描述的,还有一件事你忘了做。默认情况下,在OpenGL中禁用深度测试(因为不能保证您甚至有深度缓冲区);你需要启用它。

glEnable (GL_DEPTH_TEST);

当您致电gluPerspective (...)时,您的宽高比设置不正确,应该是640.0f/480.0f而不是1