【发布时间】:2017-09-16 18:10:48
【问题描述】:
在过去几年中,我编写了自己的 3D 游戏引擎,并希望将其实际用于游戏。
我偶然发现了以下问题:
我的游戏中有多个飞机,但让我们谈谈一个飞机。 自然,飞机无法潜入地面并在地形下飞行。 因此,我需要实现一些东西来检测飞机/喷气机与我的地面之间的碰撞。
给出的信息如下:
- 地形网格[二维数组;根据 x,z 坐标存储高度]
- 我的飞机的 Hitbox(它与我的飞机一起移动,所以边界等都已经计算和给出)
关于命中框: 我虽然关于使用哪种方法。就性能而言,最好的似乎是具有不同半径的简单球体。
所以我现在需要的是最佳类型的碰撞箱(球体、AABB、...)以及相应的最有效的计算。
我的尝试是获取每个周围的三角形并计算从那个三角形到我的 hitbox 球体每个中心的距离。如果距离小于半径,则它已成功检测到碰撞。但是当我在我的飞机上有多达 10/20 个球体并且需要检查 100 个三角形时,这将花费很多时间。
另一个尝试是从每个 hitbox 球体到地面的垂直距离。这需要更少的计算,但在接近陡峭的表面时会失败。
如果有人能帮我实现一个高效的平面/地形碰撞检测版本,我会非常高兴:)
【问题讨论】:
-
对于渲染平面,您可以在着色器中执行此操作。我假设地形是在对象之前渲染的,因此一旦您尝试在表面下方渲染平面片段(测试上一次传递的预存储深度纹理),您就会知道发生了碰撞,因此您可以将平面 ID 输出到某些 1D 纹理输出或其他内容。这种方式是像素完美的,甚至可以提供命中的位置。
-
为了提高着色器的速度,我预先计算了每个顶点的高度。所以没有“深度纹理”。从我的高度图读取后,我也可能会更改顶点位置。
-
等等。 Nvm,您在谈论深度纹理。我怎么读那个?
-
@Luecx 我将我的评论改写为答案,以便更清楚
标签: opengl 3d collision-detection