opengl - 使用 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();
}
我在这里做错了什么?我在对象上尝试了一些旋转,但得到了一些倾斜的结果(如果需要,我可以发布更多图像)。
解决方案
该对象被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);
推荐阅读
- r - 向 df 添加列:`$<-.data.frame 中的错误:替换有 x 行,数据有 153
- python-3.x - 我将如何编写一个函数来搜索文本文件,返回这些详细信息然后从文件中删除它们?
- html - 画布(甚至 svg)上的 CSS 最小高度有限制吗?
- ruby - Ruby块`block in Method':未定义的方法`inject'为true:TrueClass(NoMethodError)
- swagger-2.0 - Swagger 2.0 - 带有订单列表的有效负载
- java - 无法将名称解析为(n)“类型定义”组件
- javascript - 使用 EmailJS 从我网站上的多个表单发送电子邮件
- java - Eclipse SonarLint 误报“应删除未使用的分配 (java:S1854)”
- robotframework - 我的测试脚本是滚动(动态)下拉列表,直到在列表中找到元素,一旦列表向下滚动,元素将被加载
- android - 编辑在网格布局中创建的任何文本键入不正确可见