使用gluLookAt时遇到问题

时间:2018-10-17 19:36:39

标签: c++ opengl sfml

我已经查看了多个有关此问题,包括一个this。我想要的是一个人从走廊往下看,看着后墙,左右墙在该人的侧视图上。这是我的代码:

初始化

float lookAtX = 0, lookAtY = 0, lookAtZ = -2.5, posX = 0, posY = 0, posZ = 0;

绘图

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);

    gluLookAt(
        posX, posY, posZ, 
        lookAtX, lookAtY, lookAtZ, 
        0, 0, 1
    );
    // Back
    glBegin(GL_POLYGON);
    glColor3f(255, 0, 0); // Red
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glEnd();

    // Left
    glBegin(GL_POLYGON);
    glColor3f(0, 255, 0); // Green
    glVertex3f(-2.5, 2.5, 2.5);
    glVertex3f(-2.5, 2.5, -2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, -2.5);
    glEnd();

    // Right
    glBegin(GL_POLYGON); 
    glColor3f(0, 0, 255); // Yellow
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, 2.5, -2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(2.5, -2.5, -2.5);
    glEnd();

    glFlush();
    window.pushGLStates();

我有信心外部代码是正确的,因为我有另一段具有相同框架的代码。我也相信这会奏效...但是我想那不是xD。为什么会有黑屏,为什么它不显示墙壁?感谢您抽出宝贵的时间阅读此书

1 个答案:

答案 0 :(得分:0)

首先要注意的是,glBegin / glEnd序列进行绘制已经有好几年了。 阅读有关Fixed Function Pipeline的信息,并参阅Vertex SpecificationShader了解最新的渲染方式。


无论如何,您必须设置透视投影矩阵。但是请注意,gluLookAtgluPerspective之类的操作不仅定义了矩阵。
此操作定义一个矩阵,并将当前矩阵乘以新矩阵。这意味着您必须先通过单位矩阵在矩阵上初始化矩阵。这可以通过glLoadIdentity完成。

使用gluPerspective来设置投影矩阵堆栈上的透视投影-glMatrixMode( GL_PROJECTION )

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 90.0f, view_width / view_height, 0.1f, 10.0f );

设置视图矩阵时,必须更改视点并朝“走廊”的方向看。因为您沿z轴方向看,所以向上矢量必须为(0,1,0):

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
float lookAtX = 0, lookAtY = 0, lookAtZ = 0, posX = 0, posY = 0, posZ = -5;
gluLookAt( posX, posY, posZ, lookAtX, lookAtY, lookAtZ, 0, 1, 0 );

最后,您的顶点坐标混合了。像这样更改它:

// Back
glBegin(GL_POLYGON);
glColor3ub(255, 0, 0); // Red
glVertex3f(-2.5, -2.5, 2.5);
glVertex3f(-2.5,  2.5, 2.5);
glVertex3f( 2.5,  2.5, 2.5);
glVertex3f( 2.5, -2.5, 2.5);
glEnd();

// Left
glBegin(GL_POLYGON);
glColor3ub(0, 255, 0); // Green
glVertex3f(-2.5,  2.5,  2.5);
glVertex3f(-2.5,  2.5, -2.5);
glVertex3f(-2.5, -2.5, -2.5);
glVertex3f(-2.5, -2.5,  2.5);
glEnd();

// Right
glBegin(GL_POLYGON); 
glColor3ub(0, 0, 255); // Blue
glVertex3f(2.5,  2.5,  2.5);
glVertex3f(2.5,  2.5, -2.5);
glVertex3f(2.5, -2.5, -2.5);
glVertex3f(2.5, -2.5,  2.5);
glEnd();

预览: