1

我正在尝试在我的 OpenGL 2d 游戏中实现截锥剔除。在这一点上,我的游戏中唯一的几何对象是矩形,所以我认为这很容易,但我得到了意想不到的结果。我已经设置了一个对称的透视投影,其视场角为 45 度,近平面和远平面分别为 0.01 和 50。眼睛矢量始终平行于 z 轴,相机只能沿 x 和 y 轴移动。

我的想法是在我试图剔除的矩形的 z 坐标处获取相机当前可见的世界空间的矩形区域。因为相机正在看平截头体的中心,所以我计算到这个可见矩形区域边缘的距离如下:

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

然后我在相机的 x 和 y 坐标之间添加和减去这个距离,以获得最大和最小可见 x 和 y,然后测试给定的矩形以查看它是否在这些值之间。

我的问题是我在这里是否走在正确的轨道上,以及为什么当我在 z=5 有一个物体时,上面的公式返回一个小得离谱的值(某物 *10^-37),在 ( 0,0,0)?

4

1 回答 1

3

从头到尾解决问题,我检查了您的公式 - 请参阅草图以确认我已正确理解您。

在此处输入图像描述

鉴于我们知道 A 和 Z 并且想要求解 X,我首先写道:

tan(A) = X/Z

重新排列,我得到:

X = Z tan(A)

由于 Z = 5 和 A = 22.5 度...

X = 5* 棕褐色(22.5 度)

X = 2.07106781

所以,看起来好像你的数学是正确的,但你的代码是错误的——也许你的 tan 函数需要度数而不是弧度,或者fovAngle没有设置?我认为您需要调试和手动检查每个值。


回到更广泛的问题,即弄清楚你的截锥体内有什么和没有什么,你可能会发现你可以使用不同的测试来更优雅地回答同一个问题。许多图形编码人员使用“平面侧”测试。考虑您的视锥体是由一组 6 个平面(4 个用于视口的侧面,一个近剪裁平面和一个远剪裁平面)界定的空间体积。

给定平面上的一个点和平面的法线,您可以很容易地计算平面的方程,这反过来使得测试给定点是否在给定的“内部”(法线方向)变得简单飞机。遍历所有 6 个平面,您将快速确定一个给定点进出您的查看体积。

这个测试真正巧妙的地方在于你可以很容易地重复使用它:任何你碰巧想要做测试的简单凸多边形(例如一个矩形)都可以描述为一组平面,允许你重复使用你的“内部或外部”测试。很一般。

于 2011-03-04T14:31:43.260 回答