我正在开发一个相对较小的2D(顶视图)游戏演示,使用OpenGL作为我的图形。这是一个基本的隐形角度,因此我所有的敌人都在画一个视线弧,所以玩家知道他们在哪里。
到目前为止,我遇到的一个问题是,当我画出这个视线弧(作为一个填充的多边形)时,它会自然地显示在屏幕上的任何墙壁上,因为没有什么能阻止它:
我很好奇我怎么能最好地阻止这样的事情。我已经有了代码,可以让我检测与墙壁等的线交叉(对于敌人的视线检测),理论上我可以用它来检测这种情况并相应地绘制多边形,但这可能是非常繁琐和/或低效,所以我想如果有任何内置的OpenGL系统可以为我做这件事,它可能会做得更好。
我已经尝试过关于剪辑/遮挡等主题的问题,但我甚至不确定这些是否应该是我应该寻找的;我的OpenGL技能有限。似乎任何使用glClipPlanes或glScissor的东西都不适合这种情况,因为有大量的墙壁等等。
最后,这只是我在业余时间制作的一个演示,所以图形并不是我主要担心的。如果有一种(合理的)无痛的方式来做到这一点,那么我希望有人可以指出我正确的方向;如果没有简单的方法,那么我现在就可以解决问题或找到其他解决方法。
答案 0 :(得分:4)
OpenGL的内置遮挡处理是专为3D任务而设计的,我想不出一种简单的方法来装配它以实现您所追求的效果。如果是我,我解决这个问题的方法是使用片段着色器程序,但要预先警告,这绝对不属于“(合理)无痛的方式”。简而言之,您首先渲染二进制“遮挡贴图”,其中有黑色,其中有墙壁,否则为白色。然后像目前正在使用片段程序一样渲染“观察弧”,该片段程序旨在从查看器向目标位置搜索,搜索遮挡物(黑色像素)。如果找到遮挡物,则它将“观察弧”的像素渲染为100%透明。总的来说,虽然这是一个“正确”的解决方案,但我肯定会说这是一个复杂的功能,如果没有实现它你似乎没问题。
答案 1 :(得分:4)
这实际上是一个影子问题。我就是这样做的:
对于弧线边缘的每个点,跟踪从敌人朝向该点的(2D)射线,寻找与绿色框的交叉点。如果绿色框总是与轴对齐,则数学将更容易(寻找Ray-AABB交叉点)。将交叉点渲染为三角形扇形将为您提供弧线。
正如你所提到的,你已经有了线墙交叉码,那么只要它能告诉你从敌人到墙的距离,那么你就可以将它用于视线弧。不要自动假设它太慢 - 我们不再在486s上运行了。您可以随时减少弧线边缘的点数,以加快速度。
答案 2 :(得分:4)
我认为如果有任何内置的OpenGL系统可以为我做这件事,它可能会做得更好。
OpenGL是一个绘图API,而不是几何处理库。
实际上,您的交叉点测试方法是正确的方法。但是要加快速度,你应该使用空间细分结构。在你的情况下,你有一些东西,它呼吁二进制空间分区树。 BSP树具有很好的属性,找到一条线与墙的交叉点的复杂性平均为 O(log n),最坏的情况是 O(n log n),或者换句话说,BSP发辫非常有效。有关详细信息,请参阅BSP常见问题解答http://www.opengl.org//resources/code/samples/bspfaq/index.html