OpenGL中使用glFrustum的透视图

问题描述 投票:1回答:1

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

cube

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

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

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

opengl perspective glfrustum
1个回答
1
投票
对象被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

视图矩阵定义场景中观察者(观察者)的位置和观察方向。

如果您想改变场景的外观,则必须旋转场景(gluPerspective(90, 1, 1, 12); :]

glRotate

或者,可以通过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
© www.soinside.com 2019 - 2024. All rights reserved.