战争各向异性的雾

在这里,我不是在说如何渲染战争的雾,而是如何以更复杂的方式来模拟地形的探索。

在一个简单的方法中,一个游戏单位探测的地形只是一个圆圈,其半径表示这个单位可以看到多远。 可见区域只是等距圆的结合。 但是我可以说,stream行的游戏并非如此。

例如,请看“英雄联盟”的截图。

视野是各向异性的。 周围地形的形状也被考虑在内。

任何想法如何做到这一点?

由于障碍,形状不规则。

如果你在每个方向(360单位)周围拍摄一个光线,你确定是否遇到了障碍,如果是的话,在多远的距离。 如果射线在到达视线距离之前没有遇到任何障碍物,则停止,否则停止在遇到的地点。 这绝不是有效的或决定性的,但我希望它有帮助。

然后,您可以创建一个通过射线端点的平滑path。

如果你的单位有一个方向,你也可以通过应用一个基于角度的减less来减less最大视线距离:

max_los_distance *= dot( normalized_unit_direction, normalized_ray_direction)*0.2 + 0.8 

如上所述,朝向玩家方向的光线使用全洛斯,而射向玩家背部的光线使用60%的洛斯。

主要的一点很明显是“包含”可见性数据。 您可以在运行时通过地形投射单位的光线(如Babis的答案中所述),但这可能会非常昂贵,至less如果您的地形是完全3D的。

如果您的地形表示是基于瓦片的(或者如果它足够规则,以便在地形上投影网格是有意义的),则可以预先计算每个瓦片的可见性:将所有对存储在matrix中,或者只需将每个图块的直接可见性存储在附近的图块列表中即可。 在运行时,您只需使用单位的可见距离过滤当前瓦片的预计算可见性数据,并平滑战争迷雾的边界。

另一方面,如果你的地形已经是平铺的,比你的光线投射可能会非常快。

我认为他们是这样做的两部分。

首先是制定视线的边界。 有很多不同的方式来做这件事,他们在其他地方很好的logging。

视线边界的显示方式与此不同。 我想我已经在使用投影仪的Unity中看到类似的东西(使用着色器实现)。

请参阅UnityChat的教程https://www.youtube.com/watch?v=bE6DQdnfe3U&list=PLcGWkWha2wFd5Azr14ZJjvfnAmUKM_3E7&index=6

这种方法从上面投射出一道光线,所以它很好地拥抱着这个表面 – 在我看来,这就是你迷恋的效果。 这是使用opengl着色器来实现的: http ://wiki.unity3d.com/index.php?title=ProjectorAdditive