我使用 Farseer 已经有一段时间了,正在做一个物理教学平台项目。我脑子里有几个关于引擎的问题在很长一段时间内都没有得到解答,其中许多是关于引擎的碰撞处理。
许多人似乎无法理解引擎的工作原理,部分原因是 Farseer 缺乏适当的 API。对于那些知道的人来说,确认以下概念并杀死任何错误的概念可能是一个好主意。
概念 0:两个阶段
Farseer中的碰撞分为两个阶段:
- 宽相碰撞
- 精确碰撞(请更正我对术语的使用,如果有另一个更正式的名称......)
概念 1:Broadphase
Farseer 使用广泛的相位碰撞,将在场景中发现潜在的碰撞。所述宽相碰撞测试由...
使用四叉树,可以在包“Farseer.Collision”中找到。
“Farseer.Dynamics.World”类引用了“Farseer.Collision.QuadTreeBroadphase”。
“Farseer.Collision.QuadTreeBroadphase”引用了“Farseer.Collision.QuadTree”。
还进行了进一步的边界框测试。
如果我们发现需要知道哪对固定装置有可能发生碰撞,我们可以这样做......
/* Game.Initialize */ public override void Initialize() { OtherIrrelevantInitCode(); _world.OnBroadphaseCollision += BroadphaseHandler; base.Initialize(); } public void BroadphaseHandler(ref FixtureProxy fp1, ref FixtureProxy fp2) { // code to read about fp1 and fp2 }
但是之后...
小问题1
有哪些常见情况有助于我们了解哪些设备对可能发生碰撞?
概念二:事件的意义
定义两个关键字:
- 接触:两个物体接触。数组 Manifold.Points不是空的。
- 碰撞:两个物体第一次接触。
BeforeCollision表示两个对象没有碰撞也没有接触。
OnCollision表示两个对象正在碰撞,但触摸不会触发此事件。
AfterCollision意味着两个物体正在碰撞,但现在它们只是接触。
OnSeparation表示两个对象正在接触,但现在它们不是。
概念 3:使用事件
宽相碰撞测试和精确碰撞测试始终进行。
通过在事件OnCollision中返回 false或使用 IgnoreCollision 方法可以禁用精确碰撞。
我不止一次听到人们说“让 OnCollision 为空并返回 true”。这到底是什么意思?使用事件意味着我们希望在上述事件发生时应用额外的效果(例如杀死敌人、得分、播放声音等)。