根据《游戏人工智能编程案例精粹》第三章中中方法描述,整个算法中需要将世界空间的点转到局部空间。比如场景中有若干障碍物,但并不是每一个都需要检查,也就是先要筛选。这个筛选过程中过滤掉“后面”的障碍物是很重要的环节。所谓“后面”是相对的,是根据朝向来判断的。比如我现在正前方5米有一个障碍物,这个正前方是我移动的方形。那这个障碍物是应该要被检查的。如果我现在转向180度,移动方向就完全背对这个障碍物,虽然我们之间的距离还是5米,但这时不需要检查的。这就是局部坐标空间的典型应用。
这个可能有个疑问,Unity不是已经提供很方便的转换吗?Transform.Translate还有Transform.worldToLocalMatrix。但是,在某些场景下还是有必要的。比如游戏是帧同步的,位置,方向这些都不能依赖Transform,而是逻辑层自己计算。因为帧同步为了避免浮点数带来的差异需要定点数计算,而且需要做到逻辑层和显示层分离。这两点中任意一点Transform都不能满足。
原书配套代码中将世界空间的点转到局部空间,但没有展开讲这个局部空间变换的过程。在其提供的源码中分两个函数实现。
这套书的配套源码人工游戏智能编程案例精粹配套源码Programming-Game-AI-by-Example
//--------------------- PointToLocalSpace --------------------------------
//
//------------------------------------------------------------------------
inline Vector2D PointToL