opengl:无法绘制左墙
opengl: unable to draw left wall
我正在尝试开始使用 opengl 构建一个非常基本的房间。出于某种原因,在函数 drawWalls() 中,左墙没有被绘制,或者我误解了相机的定位。有谁知道为什么我在 运行 这段代码时看不到左墙?
我的代码:
#include <gl/gl.h>
#include <gl/glut.h>
/*defining colors used in the room*/
GLfloat black[] = {0.0, 0.0, 0.0, 1.0};
GLfloat white[] = {1.0, 1.0, 1.0, 1.0};
GLfloat brown[] = {165.0/255.0, 42.0/255.0, 42.0/255.0, 1.0};
void drawFloor()
{
glBegin(GL_QUAD_STRIP);
glColor4fv(black);
glVertex3f(0.0, 0.0, -3.0);
glVertex3f(1.0, 0.0, -3.0);
glVertex3f(2.0, 0.0, -3.0);
glEnd();
}
void drawWalls()
{
glBegin(GL_QUAD_STRIP);
glColor4fv(white);
glPolygonMode(GL_FRONT, GL_FILL);
//draw left wall
glVertex3f(0.0, 0.0, 2.0);
glVertex3f(0.0, 1.0, 2.0);
glVertex3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 1.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
//draw front wall
glVertex3f(0.0, 0.0, 3.0);
glVertex3f(0.0, 1.0, 3.0);
glVertex3f(1.0, 0.0, 3.0);
glVertex3f(1.0, 1.0, 3.0);
glVertex3f(2.0, 0.0, 3.0);
glVertex3f(2.0, 1.0, 3.0);
glEnd();
}
void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 0.0, 0.8, 0.0, 1.0, 0.0, 1.0, 0.0);
drawFloor();
drawWalls();
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat) w / (GLfloat) h, 1, 500);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void idleFunc()
{
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("My room");
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idleFunc);
glutMainLoop();
}
为什么你希望看到左边的墙?它在屏幕外(对于您 window 的任何合理纵横比)。如果我们想象一些 "world space",你会遇到以下情况:你的相机被放置在原点并且几乎看向对角线向量。 lfet 墙也放置在 x=0 处,因此视图方向和墙之间几乎有 45 度角。您的平截头体从相机前面的距离 1 开始,垂直 FOV 为 60 度,水平 FOV 由 window 的纵横比定义。因此,如果您将 window 设置得比高度宽得多,您就有机会看到那堵墙。
我正在尝试开始使用 opengl 构建一个非常基本的房间。出于某种原因,在函数 drawWalls() 中,左墙没有被绘制,或者我误解了相机的定位。有谁知道为什么我在 运行 这段代码时看不到左墙?
我的代码:
#include <gl/gl.h>
#include <gl/glut.h>
/*defining colors used in the room*/
GLfloat black[] = {0.0, 0.0, 0.0, 1.0};
GLfloat white[] = {1.0, 1.0, 1.0, 1.0};
GLfloat brown[] = {165.0/255.0, 42.0/255.0, 42.0/255.0, 1.0};
void drawFloor()
{
glBegin(GL_QUAD_STRIP);
glColor4fv(black);
glVertex3f(0.0, 0.0, -3.0);
glVertex3f(1.0, 0.0, -3.0);
glVertex3f(2.0, 0.0, -3.0);
glEnd();
}
void drawWalls()
{
glBegin(GL_QUAD_STRIP);
glColor4fv(white);
glPolygonMode(GL_FRONT, GL_FILL);
//draw left wall
glVertex3f(0.0, 0.0, 2.0);
glVertex3f(0.0, 1.0, 2.0);
glVertex3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 1.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
//draw front wall
glVertex3f(0.0, 0.0, 3.0);
glVertex3f(0.0, 1.0, 3.0);
glVertex3f(1.0, 0.0, 3.0);
glVertex3f(1.0, 1.0, 3.0);
glVertex3f(2.0, 0.0, 3.0);
glVertex3f(2.0, 1.0, 3.0);
glEnd();
}
void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 0.0, 0.8, 0.0, 1.0, 0.0, 1.0, 0.0);
drawFloor();
drawWalls();
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat) w / (GLfloat) h, 1, 500);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void idleFunc()
{
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("My room");
glEnable(GL_DEPTH_TEST);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idleFunc);
glutMainLoop();
}
为什么你希望看到左边的墙?它在屏幕外(对于您 window 的任何合理纵横比)。如果我们想象一些 "world space",你会遇到以下情况:你的相机被放置在原点并且几乎看向对角线向量。 lfet 墙也放置在 x=0 处,因此视图方向和墙之间几乎有 45 度角。您的平截头体从相机前面的距离 1 开始,垂直 FOV 为 60 度,水平 FOV 由 window 的纵横比定义。因此,如果您将 window 设置得比高度宽得多,您就有机会看到那堵墙。