我使用Farseer已经有一段时间了,从事一个物理教学平台项目。我脑子里有几个关于发动机的问题,有很长一段时间没有回答,其中很多问题都是关于发动机的碰撞处理。
许多人似乎在理解引擎的工作上有问题,部分原因是Farseer缺乏合适的API。对于那些熟悉的人来说,确认以下的概念,杀死了任何错误的概念,这可能是个好主意。
概念0:两个阶段
法赛尔碰撞分为两个阶段:
概念1:宽阶段
采用宽相位碰撞的Farseer将在场景中发现潜在的碰撞。广泛的相位碰撞试验是由.
但后来..。
小问题1
对于我们来说,有哪些常见的情况可以帮助我们知道哪些固定装置可能发生碰撞?
概念2:事件的意义
两个关键词的定义:
BeforeCollision意味着两个对象是,不碰撞,和,不接触。
OnCollision意味着两个对象正在冲突,但触摸不会触发此事件。
AfterCollision意味着与相撞的两个物体,但现在它们只接触。
OnSeparation意味着接触的两个对象,但现在没有了。
概念3:使用事件
宽相位碰撞试验和精确碰撞试验是公司一直在进行的。
可以通过在事件OnCollision中返回false或使用IgnoreCollision方法禁用精确冲突。
我不止一次听到有人说“让OnCollision空着,然后返回true”。那到底是什么意思?使用这些事件意味着我们想要应用额外的效果(例如杀死敌人,得分,播放声音等等)。当上述事件发生的时候。
发布于 2012-11-16 11:17:38
这个答案适用于Farseer物理学3.3.1 (目前的稳定版本,在撰写本文时)
宽带只是一种性能优化。它很快就决定了什么会发生碰撞,这样那些不能碰撞的东西就不会有更昂贵的窄相位碰撞检测运行。
根据我的经验,法西耶的events并没有设计得那么好。我发现我不得不为我自己的游戏修改它们--但幸运的是,这段代码实际上并不难阅读和修改。此外,有些地方的文档并不准确。
下面是Farseer物理中所做的事情:
BeforeCollision发生在宽相位注册一个新的潜在冲突之前,然后为这两个固定装置创建一个Contact对象。可以通过在事件处理程序中返回Contact来阻止false的创建。
Contact的存在并不一定意味着这两个固定装置实际上是接触的-只是广义的阶段成功了。Contact可以是触摸/不接触,也可以是启用/禁用(它们开始启用和不触摸)。
当一个OnCollision从不接触变为触摸时,Contact就会发生.您可以通过返回false来禁用联系人。奇怪的是,如果返回true,您可以重新启用另一个事件处理程序在该步骤中禁用的联系人(这是我为自己的游戏更改的内容之一)。
只有一个启用的,触摸接触对物理模拟有任何影响。
OnSeparation与OnCollision正好相反:当触点从接触变为不接触时,它就会触发。这里没有办法禁用/启用联系人。
在该框架上参与物理模拟的每个Contact都需要使用AfterCollision (所以:那些启用、触摸、而不是在一个沉睡的岛屿上)。它在物理模拟步骤之后被调用,但在清理之前--最显著的是在Body.Force和Body.Torque被清除之前(便于声音效果等等)。
通常你只是利用这些事件来触发你的效果-粒子,声音,游戏机制,比如摧毁物体,等等。在这种情况下,您订阅任何您想要的,做任何您喜欢的,然后返回true (而不是禁用/覆盖联系人)。
如果您想要处理物理引擎或禁用联系人(特别是当您可以意外地重新启用它们,使用另一个事件处理程序时,正如我前面提到的那样),它会变得复杂得多。如果Farseer的内置事件不适合您,那么进入它的代码并添加您自己的代码是完全合理的。在这一高级水平上,这实际上是一种从源头构建的必要性,这样你就可以准确地检查到底发生了什么。
https://stackoverflow.com/questions/13393945
复制相似问题