使用 glFrustum 在 OpenGL 中绘制透视图
Perspective drawing in OpenGL using glFrustum
我正在尝试以橱柜视角绘制立方体。这是 glOrtho
中的立方体:
其他面孔:
背面 - 青色,左侧 - 洋红色,下方 - 蓝色
This is what I get
This is what I want to achieve
我的代码:
//init function
glClearColor(1, 1, 1, 1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-10, 10, -10, 10, 4,6);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0,0,-lat);//it doesn't show in the window without this.
DisplayAxis();
DisplayObject();
break;
//object initalization. I use glGenList and glCallList to draw it
void InitObject() {
glNewList(k, GL_COMPILE);
glColor3f(1, 0, 0);
glBegin(GL_QUADS);
glVertex3d(0, lat, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, 0, lat);
glVertex3d(0, 0, lat);
glEnd();
glColor3f(1, 1, 0);
glBegin(GL_QUADS);
glVertex3d(lat, 0, 0);
glVertex3d(lat, 0, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, lat, 0);
glEnd();
glColor3f(0, 1, 0);
glBegin(GL_QUADS);
glVertex3d(0, lat, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, lat, 0);
glVertex3d(0, lat, 0);
glEnd();
glColor3f(0, 0, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, 0);
glVertex3d(lat, 0, 0);
glVertex3d(lat, 0, lat);
glVertex3d(0, 0, lat);
glEnd();
glColor3f(1, 0, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, lat);
glVertex3d(0, 0, 0);
glVertex3d(0, lat, 0);
glVertex3d(0, lat, lat);
glEnd();
glColor3f(0, 1, 1);
glBegin(GL_QUADS);
glVertex3d(0, lat, 0);
glVertex3d(lat, lat, 0);
glVertex3d(lat, 0, 0);
glVertex3d(0, 0, 0);
glEnd();
glEndList();
}
我在这里做错了什么?我在对象上尝试了一些旋转,但得到了一些倾斜的结果(如果需要,我可以 post 更多图像)。
对象被Viewing frustum的近平面裁剪。
不是你必须沿负 z 轴平移对象,才能在视锥体的近平面和远平面之间移动对象:
glTranslated(0,0,-lat);//it doesn't show in the window without this.
由于视图 space z 轴指向视口,您必须沿负 z 轴移动对象。
到近平面的距离为4,到远平面的距离为6:
glFrustum(-10, 10, -10, 10, 4,6);
立方体前面的距离小于4,因此被近平面裁剪。
改变截锥体,让立方体完全在截锥体内解决问题:
glFrustum(-10, 10, -10, 10, 4,6);
glFrustum(-2.5, 2.5, -2.5, 2.5, 1, 10);
glTranslated(0,0,-lat);
glTranslated(0, 0, -6);
为了获得良好的视角和观察场景,请使用视野较小的投影矩阵(截锥体):
glFrustum(-1, 1, -1, 1, 1, 12);
或者,您可以通过 gluPerspective
定义平截头体并以度为单位设置视角:
gluPerspective(90, 1, 1, 12);
视图矩阵定义场景中观察者(观察者)的位置和观察方向。
如果您想以不同的方式查看场景,则必须旋转场景 (glRotate
):
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0, 0, -8);
glRotatef(30, 1, 0, 0);
glRotatef(-45, 0, 1, 0);
或者,观察场景(观察矩阵)可以由 gluLookAt
定义。参数 1-3 是观察者的位置(眼睛或相机位置的 x、y、z 分量)。参数 4-6 是目标点(观察者注视的位置)。第7-9个参数是向上的向量。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5, 5, 7, 0, 0, 0, 0, 1, 0);
我正在尝试以橱柜视角绘制立方体。这是 glOrtho
中的立方体:
其他面孔: 背面 - 青色,左侧 - 洋红色,下方 - 蓝色
This is what I get
This is what I want to achieve
我的代码:
//init function
glClearColor(1, 1, 1, 1);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-10, 10, -10, 10, 4,6);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0,0,-lat);//it doesn't show in the window without this.
DisplayAxis();
DisplayObject();
break;
//object initalization. I use glGenList and glCallList to draw it
void InitObject() {
glNewList(k, GL_COMPILE);
glColor3f(1, 0, 0);
glBegin(GL_QUADS);
glVertex3d(0, lat, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, 0, lat);
glVertex3d(0, 0, lat);
glEnd();
glColor3f(1, 1, 0);
glBegin(GL_QUADS);
glVertex3d(lat, 0, 0);
glVertex3d(lat, 0, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, lat, 0);
glEnd();
glColor3f(0, 1, 0);
glBegin(GL_QUADS);
glVertex3d(0, lat, lat);
glVertex3d(lat, lat, lat);
glVertex3d(lat, lat, 0);
glVertex3d(0, lat, 0);
glEnd();
glColor3f(0, 0, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, 0);
glVertex3d(lat, 0, 0);
glVertex3d(lat, 0, lat);
glVertex3d(0, 0, lat);
glEnd();
glColor3f(1, 0, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, lat);
glVertex3d(0, 0, 0);
glVertex3d(0, lat, 0);
glVertex3d(0, lat, lat);
glEnd();
glColor3f(0, 1, 1);
glBegin(GL_QUADS);
glVertex3d(0, lat, 0);
glVertex3d(lat, lat, 0);
glVertex3d(lat, 0, 0);
glVertex3d(0, 0, 0);
glEnd();
glEndList();
}
我在这里做错了什么?我在对象上尝试了一些旋转,但得到了一些倾斜的结果(如果需要,我可以 post 更多图像)。
对象被Viewing frustum的近平面裁剪。
不是你必须沿负 z 轴平移对象,才能在视锥体的近平面和远平面之间移动对象:
glTranslated(0,0,-lat);//it doesn't show in the window without this.
由于视图 space z 轴指向视口,您必须沿负 z 轴移动对象。
到近平面的距离为4,到远平面的距离为6:
glFrustum(-10, 10, -10, 10, 4,6);
立方体前面的距离小于4,因此被近平面裁剪。
改变截锥体,让立方体完全在截锥体内解决问题:
glFrustum(-10, 10, -10, 10, 4,6);
glFrustum(-2.5, 2.5, -2.5, 2.5, 1, 10);
glTranslated(0,0,-lat);
glTranslated(0, 0, -6);
为了获得良好的视角和观察场景,请使用视野较小的投影矩阵(截锥体):
glFrustum(-1, 1, -1, 1, 1, 12);
或者,您可以通过 gluPerspective
定义平截头体并以度为单位设置视角:
gluPerspective(90, 1, 1, 12);
视图矩阵定义场景中观察者(观察者)的位置和观察方向。
如果您想以不同的方式查看场景,则必须旋转场景 (glRotate
):
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0, 0, -8);
glRotatef(30, 1, 0, 0);
glRotatef(-45, 0, 1, 0);
或者,观察场景(观察矩阵)可以由 gluLookAt
定义。参数 1-3 是观察者的位置(眼睛或相机位置的 x、y、z 分量)。参数 4-6 是目标点(观察者注视的位置)。第7-9个参数是向上的向量。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5, 5, 7, 0, 0, 0, 0, 1, 0);