18910140161

OpenGL的gluLookAt()和 glOrtho()

顺晟科技

2021-06-16 10:38:17

426

gluLookAt函数的原型是:

void GluLookat(Gldouble eyx,Gldouble eye,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,Gldouble upz);

简单来说,这个功能可以理解为相机在三维世界中的坐标位置和方位。为了确定摄像机子世界的状态,需要确定该功能的参数。前三个参数是摄像机的位置坐标,在此位置摄像机可以360度观察;然后接下来的三个参数表示相机面对的目标位置,也就是相机观察到的方向。最后三个参数决定了摄像机的放置状态。例如,在现实世界中,相机可以直立放置、侧向放置或倒置放置。同样,在opengl中,我们的相机也可以这样调整。如果最后三个参数为(0,1,0),则表示摄像机直立,当(0,-1,0)颠倒放置时。

GlOrtho()的函数原型是:

空glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

这个函数决定了我们在三维世界中可以观察到的矩形区域。前35个参数确定矩形区域左下前点的位置,第二个46确定矩形区域右上后点的位置。注意,这个点不是世界坐标,而是相对于相机的位置。

例如,如果我们在场景中画一条线,我们的初始化函数中的代码是

glmatrix mode(GL _ PROJECt);

glLoadIdentity();

glOrtho(-3.0f,3.0f,-3.0f,3.0f,0.1f,5.0f);

gluLookAt(0.0f,0.0f,-5.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);

glmatrix mode(GL _ model view);

glLoadIdentity();

我们把相机放在(0,0,-5),视野区域从左到-3,从右到3,从下到-3,从上到3,离相机最近的是0.1。

从f到离相机最远的5.0f距离的范围是我们可以观察到的位置,但是超过这个区域我们就看不到了。绘图功能中的代码是

glClear(GL _ COLE _ BUFFER _ BIT | GL _ DEPTH _ BUFFER _ BIT);

glLoadIdentity();

glColor3f(1.0f,0.0f,0.0f);

glBegin(GL _ LINES);

glVertex3f(0.0f,0.0f,0.0f);

glVertex3f(0.0f,2.0f,0.0f);

glEnd();

我们画了一条从(0,0,0)到(0,2,0)的红色直线,运行结果是

现在我们修改指定可视区域大小的参数

glOrtho(-3.0f,3.0f,-3.0f,3.0f,0.1f,4.0f);

再次运行程序,结果是

这时候我们把最远的视野设为4.0f,相机的位置是(0,-5,0)。显然,如果我们看刚刚画的直线,我们看不到它,因为直线离我们的视野太远,超出了我们的视野,所以我们可以看到一切。

我们再次修改参数如下

glOrtho(-3.0f,3.0f,-3.0f,3.0f,6.0f,10.0f);

运行代码,结果是

这时我们把可视范围设置为离摄像机最近的6.0,最远的10.0是可视区域,而摄像机在(0,-5,0)的位置,我们画的直线距离摄像机5.0,所以还是看不见。

让我们恢复代码,使行可见。按如下方式修改代码

gluLookAt(0.0f,0.0f,-5.0f,0.0f,0.0f,0.0f,0.0f,-1.0f,0.0f);

再次运行程序,结果是

发现直线向下,因为摄像头是上下颠倒的,所以你看到的新鲜水果也是变化的。您可以修改其他参数,看看运行结果是否与您自己的相机相同。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航