首页 > 解决方案 > 使用 glFrustum 在 OpenGL 中绘制透视图

问题描述

我正在尝试以橱柜的视角绘制一个立方体。这是中的立方体glOrtho

立方体

其他面:背面 - 青色,左侧 - 洋红色,向下 - 蓝色

这就是我得到的

这就是我想要实现的

我的代码:

//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();
}

我在这里做错了什么?我在对象上尝试了一些旋转,但得到了一些倾斜的结果(如果需要,我可以发布更多图像)。

标签: openglperspectiveglfrustum

解决方案


该对象被Viewing frustum的近平面裁剪。

不必沿负 z 轴平移对象,以将对象移动到视锥体的近平面和远平面之间:

glTranslated(0,0,-lat);//it doesn't show in the window without this.

由于视图空间 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);


推荐阅读