我已经查看了多个有关此问题,包括一个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。为什么会有黑屏,为什么它不显示墙壁?感谢您抽出宝贵的时间阅读此书
答案 0 :(得分:0)
首先要注意的是,glBegin
/ glEnd
序列进行绘制已经有好几年了。
阅读有关Fixed Function Pipeline的信息,并参阅Vertex Specification和Shader了解最新的渲染方式。
无论如何,您必须设置透视投影矩阵。但是请注意,gluLookAt
和gluPerspective
之类的操作不仅定义了矩阵。
此操作定义一个矩阵,并将当前矩阵乘以新矩阵。这意味着您必须先通过单位矩阵在矩阵上初始化矩阵。这可以通过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();
预览: