我正在尝试从橱柜角度绘制一个立方体。这是glOrtho
中的立方体:
[其他面孔:背面-青色,左侧-洋红色,向下-蓝色
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();
}
我在这里做错了什么?我尝试对对象进行一些旋转,但得到一些偏斜的结果(如果需要,我可以发布更多图像)。
不是您必须沿负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
视图矩阵定义场景中观察者(观察者)的位置和观察方向。如果您想改变场景的外观,则必须旋转场景(
gluPerspective(90, 1, 1, 12);
:]
或者,可以通过glRotate
定义场景的外观(视图矩阵)。参数1-3是观察者的位置(眼睛的x,y,z分量或相机位置)。参数4-6是目标点(观察者正在看的地方)。参数7-9是向上向量。
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(0, 0, -8); glRotatef(30, 1, 0, 0); glRotatef(-45, 0, 1, 0);
gluLookAt