1.SDF表示空间中的一点到形状的最短距离,一般用正值表示外部用负值表示内部。
2.MOBA类游戏通常使用的摇杆移动,因此面对障碍物需要检测碰撞并解决碰撞。常见的解决碰撞的方式有(1)使用碰撞器进行碰撞检测,并绕障碍物进行移动。(2)NavMesh方式,并绕障碍物进行移动。(3)栅格方式,检测圆与阻挡栅格的距离,碰撞后移动方向不确定。(4)基于SDF的摇杆移动。
3.利用栅格数据预计算SDF:SDF记录点到障碍物的距离,我们无法存储地图所有的点,因此我们需要根据障碍物精度对整张地图进行栅格化,主流的5V5moba类游戏一般使用256x256的地图。仅当角色进入临界区的时候,w值会超过了提前设置的阈值,玩家角色才与相关的障碍物进行精确的SDF计算。通常玩家在栅格化的SDF中是一个圆而不是一个点,这有效地避免了w值在SDF栅格邻接处发生突变。w值是由圆圈涵盖的几个栅格共同决定的。
4.当玩家角色与障碍物发生碰撞时,突然停止移动的体验是非常糟糕的。SDF在发生碰撞之后玩家会绕障碍物滑行,滑行的速度由碰撞角度与法线的夹角决定。
5.为了避免在夹角处往返移动,那么当前后滑行方向相差90度以上时,停止滑动,重新拨动摇杆方可再次移动。
6.角色不可越过障碍物进行远距离移动,若障碍物较大,则考虑使得角色卡在障碍物近边处。
7.对于动态障碍物,按帧去更改整张地图的SDF显然不现实,单可以预先生成动态障碍SDF,并于静态的进行交集叠加。如果大量动态障碍物分布稀疏,则可以通过空间分割管理动态障碍物,从而减少SDF的计算次数。