2011-05-16 76 views
3

我使用了gluPerspective和gluLookAt的透视图,并且我有一个对象的x,y世界坐标。我如何确定对象是否在可视区域之外?请注意,相机总是在四处移动。摄像机外部的对象OpenGL

+1

Frustum Culling是去除不在屏幕上的所有内容的过程,因此我建议可以使用相同的算法找到相反的结果:http://www.flipcode.com/archives/Frustum_Culling.shtml – 2011-05-16 12:30:03

+0

但是我想知道是否有东西被删除。我有两辆车,相机被设置在它们的中间位置。如果他们离得太远(如果他们都“离开”相机),我必须把他们放回中间,有什么想法? – 2011-05-16 12:33:24

回答

5

第一件事:第一件事:OpenGL没有相机。它只是转换顶点。而gluLookAt只是对与思考相机运动相反的对象应用变换。

该溶液已经在由Robert Massaioli第一评论给出:在OpenGL中的透视变换在截头锥体的形式描述(gluPerpective只是计算平截头体的参数,并传递给这些glFrustum)。因此,通过确定对象的平截头体剔除,即如果他们被剔除,您可以确定它们是否仍然可见。

0

当你说他们离开相机时,你的意思是他们偏离了双方,因为你正在寻找一个固定的距离? ..或者你的意思是他们只是消失。

如果是第一种情况(偏离镜头两侧),您应该能够计算出根据当前视角设置移动相机所需的距离x,y平面有多远。

如果是后一种情况,您可能只需增加最大Z深度即可阻止它们被剔除。

[编辑1]gluPerspective调用您设置视角和纵横比。你应该知道与飞机的距离以及从中心点到汽车的距离,以便获得所需的全部信息。剩下的只是一个小三角来确定什么是可见的,哪些不是。

[编辑2]我发现another very useful tutorial描述各种方式做域剔除你想做的事情。

+0

这是第一例。相机是一个固定的距离,但随着汽车旋转,这是我的主要问题。 – 2011-05-16 12:54:15