我已经使用Farseer一段时间了,参与了一个物理教学平台项目。我的大脑里有几个问题一直没有解答,其中很多是关于引擎的碰撞处理。
许多人似乎都有难以理解引擎工作的问题,部分原因是Farseer缺乏适当的API。对于那些知道的人来说,确认以下概念并消除任何错误概念可能是个好主意。
概念0:两个阶段
Farseer中的碰撞分为两个阶段:
- 广义碰撞检测
- 精确碰撞(请纠正我的术语使用,如果有更官方的名称......)
概念1:广义碰撞检测
使用广义碰撞检测,Farseer将在场景中寻找潜在的碰撞。所谓的广义碰撞检测是通过......
The use a quad tree, which can be found in package "Farseer.Collision".
The class "Farseer.Dynamics.World" has a reference to "Farseer.Collision.QuadTreeBroadphase".
"Farseer.Collision.QuadTreeBroadphase" has a reference to "Farseer.Collision.QuadTree".
Further bounding box test is also done.
If we ever find a need to know which pair(s) of fixtures has the potential to collide, we may do this...
/* 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
有哪些情况是有用的,让我们知道哪些夹具对可能发生碰撞?
概念2:事件的含义
两个关键词的定义:
- 接触:两个物体接触。数组Manifold.Points不为空。
- 碰撞:两个物体第一次接触。
BeforeCollision意味着两个物体没有碰撞,也没有接触。
OnCollision意味着两个物体正在碰撞,但不会触发接触。
AfterCollision意味着两个物体曾经碰撞,但现在只接触。
OnSeparation意味着两个物体曾经接触,但现在没有。
概念3:使用事件
宽相碰撞测试和精确碰撞测试总是要进行。
可以通过在事件OnCollision中返回false或使用IgnoreCollision方法来禁用精确碰撞。
我听过不止一次人们说“只需将OnCollision留空并返回true”。这到底是什么意思?使用事件意味着我们希望在发生上述事件时应用其他效果(例如杀死敌人、得分、播放声音等)。