计算:球面/方形/平面是否从某一点可见?

我正在寻找一种方法来检测,如果一个表单(形状可以改变,如果algorithm需要它)可以从基于3D瓦片的世界中的一个点看到。 这应该被用来作为某种types的墙上黑客保护措施,以便将玩家隐藏在墙后面。

这并不一定非常精确。 唯一的条件是algorithm不会返回假阴性。 因此,我认为这可能是最简单的select,在彼此的球员周围创造一个相当大的球体,并从视点到虚拟球体明显地进行操作。 我打算在较大的地图上使用这个,只有当玩家彼此远离时。 如果你能看到球员身后有一堵墙,那就不成问题了。

因为我不知道如何解决scheme可能看起来像我正在寻找一个非常抽象的说明这种algorithm是如何工作的。

我发现了这个非常类似的问题: 预计算可视性但是我认为这导致我走错了方向,因为我的主要方面是速度而不是正确。

从来没有任何假阴性的系统将需要依赖graphics遮挡查询的一些变体。 雷射和其他基于物理学的措施将无法正常工作。

您可以使用GPU Occlusion Query作为最简单的解决scheme。 渲染你的静态几何graphics(只是立体的几何graphics,不需要颜色或纹理或其他表面效果;甚至不需要颜色输出缓冲区,所有你正在建立的深度缓冲区和testing)。 然后在深度传递查询下渲染玩家。 查询会告诉你玩家几何体的任何片段是否通过了深度testing,这意味着它在某个静态几何体的前面,而不是被剪切/剔除。 再次,渲染只是顶点位置(和骨骼animation数据),没有别的,也不需要颜色缓冲区; 除非您不需要从生成的深度缓冲区中读取,否则非常类似于阴影贴图。

我自己没有做过任何性能testing,也没有看到最近硬件的任何数字,但是过去用CPU软件三角形光栅扫描仪来做这件事速度更快。 部分原因是GPU可能被充分利用来渲染游戏。 更大的部分原因是,将渲染命令发送到GPU需要花费大量时间,渲染所有内容,然后返回结果。 一个低分辨率的深度渲染简单的几何体在CPU上不难做到,可以很容易地进行multithreading和vector化处理,而且效率可能更高(尽管如此,您可能不需要额外的性能;每场比赛都是一个巨大的AAA事件)。

再次请注意,您可以在低分辨率下进行所有这些遮挡testing。 仅仅因为你的游戏在1920×1080渲染并不意味着遮挡查询需要在这个尺寸上进行。 通常使用一些较小尺寸的多采样禁用,可能不是相同的纵横比。 如果它太小,你会开始明显的假阴性。 随着任何尺寸的减less,你可能会得到一些非常小的假阴性(例如,如果只有几个像素的玩家是可见的,而不是其他人会真正注意到的)。 如果你真的需要零假阴性(你不这样做),你可能希望在全分辨率下使用相同的多采样设置来完成遮挡查询,但是这样做会很难达到性能。

好像你需要一个遮挡查询algorithm。

粗略地说,为了从某个角度检查某个对象是否可见,一种方法是使用光线投射algorithm:

  1. 从查看器的角度投射光线到对象。
  2. 如果光线在击中目标物体之前击中了任何其他物体,则可以将目标物体设置为部分不可见。
  3. 这通常是不够的,你需要射线多射线。

即使你是光线投射边界卷而不是实际的三角形网格,这将更可能是非常慢(除非你有一个非常小的场景),因为对象没有空间sorting,所以你最终将检查每一个对象,即使他们是不可能的,甚至远离射线的path。

为了解决这个问题,你需要使用某种空间分区,如网格,八叉树,甚至是bsp树。 这样,您将只能testing更有可能成为障碍的对象。

我也在这里回答了一个类似的问题。 并涵盖了多种types的可视性确定algorithm。