检测四边形在OpenGL中是否实际可见2D

时间:2013-12-16 04:00:11

标签: vb.net opengl opentk

我目前有16个图块,单个图像组成1个大图。在实际绘图之前,我在开始时向右转换:

GL.Translate(G_.Pan(0), G_.Pan(1), 0)

然后我通过这样做放大:

GL.Ortho(-G_.Size * 1.5 ^ G_.ZoomFactor, G_.Size * 1.5 ^ G_.ZoomFactor, G_.Size * 1.5 ^ G_.ZoomFactor, -G_.Size * 1.5 ^ G_.ZoomFactor, -1, 1)

G_.Size是一个常量,仅在启动时根据参数而变化,缩放系数范围从-1到-13

我想要做的是检查16个瓷砖中的1个是否在可见区域内,因此当它们不在屏幕上时我会停止绘图。我找到了一些非常复杂的方法,但它是3D,对于一些应该简单的东西来说似乎很多工作。我认为它只是检查一个点是否在可见区域的范围内,但我不知道如何获得可见区域。

1 个答案:

答案 0 :(得分:3)

Andon M Coleman已经建议你实施投影量剔除(截头剔除的一般形式)。但这不在OpenGL的范围之内。您必须了解OpenGL不是一个“神奇”的场景图,可以进行场景管理等。它只是绘制API;它的作用是在屏幕上放置阴影,纹理点,线条或三角形,就是这样。其余部分取决于您,或您选择实施它的库。

在投影体积剔除的情况下,您正在测试给定的几何体是否与形成体积边界的planes定义的体积相交。您的投影矩阵定义了这样的平面,特别是它将视图空间顶点位置体积转换为透视划分剪辑空间的范围[-1; 1]×[-1; 1]×[0; 1]。所以通过inverting投影矩阵和不投影[-1; 1]×[-1; 1]×[0; 1]立方体的角,通过它确定视图空间中投影体的极限平面

然后,您可以使用该信息将您的四边形与卷相交,以查看它们是否穿过它,即以任何方式可见。