首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >概念检查器: Farseer中的碰撞情况

概念检查器: Farseer中的碰撞情况
EN

Stack Overflow用户
提问于 2012-11-15 08:40:40
回答 1查看 2K关注 0票数 4

我使用Farseer已经有一段时间了,从事一个物理教学平台项目。我脑子里有几个关于发动机的问题,有很长一段时间没有回答,其中很多问题都是关于发动机的碰撞处理。

许多人似乎在理解引擎的工作上有问题,部分原因是Farseer缺乏合适的API。对于那些熟悉的人来说,确认以下的概念,杀死了任何错误的概念,这可能是个好主意。

概念0:两个阶段

法赛尔碰撞分为两个阶段:

  1. 宽相位碰撞
  2. 精确的碰撞(请纠正我使用的术语,如果它有更多的官方名称.)

概念1:宽阶段

采用宽相位碰撞的Farseer将在场景中发现潜在的碰撞。广泛的相位碰撞试验是由.

  1. 使用四叉树,可以在包"Farseer.Collision“中找到。

  1. 类"Farseer.Dynamics.World“引用了"Farseer.Collision.QuadTreeBroadphase”。

  1. "Farseer.Collision.QuadTreeBroadphase“指的是"Farseer.Collision.QuadTree”。

  1. 还进行了进一步的包围盒测试。

  1. 如果我们发现有必要知道哪一对装置有可能碰撞,我们可以这样做. /* Game.Initialize */ public覆盖void (){ OtherIrrelevantInitCode();_world.OnBroadphaseCollision += BroadphaseHandler;base.Initialize();} public _world.OnBroadphaseCollision( ref FixtureProxy fp1,ref FixtureProxy fp2) { //代码来阅读fp1和fp2 }

但后来..。

小问题1

对于我们来说,有哪些常见的情况可以帮助我们知道哪些固定装置可能发生碰撞?

概念2:事件的意义

两个关键词的定义:

  1. 触摸:两个物体在接触中。数组Manifold.Points是而不是空。
  2. 碰撞:两个物体第一次接触到,。

BeforeCollision意味着两个对象是,不碰撞,和,不接触。

OnCollision意味着两个对象正在冲突,但触摸不会触发此事件。

AfterCollision意味着与相撞的两个物体,但现在它们只接触

OnSeparation意味着接触的两个对象,但现在没有了。

概念3:使用事件

宽相位碰撞试验和精确碰撞试验是公司一直在进行的

可以通过在事件OnCollision中返回false或使用IgnoreCollision方法禁用精确冲突。

我不止一次听到有人说“让OnCollision空着,然后返回true”。那到底是什么意思?使用这些事件意味着我们想要应用额外的效果(例如杀死敌人,得分,播放声音等等)。当上述事件发生的时候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-16 11:17:38

这个答案适用于Farseer物理学3.3.1 (目前的稳定版本,在撰写本文时)

宽带只是一种性能优化。它很快就决定了什么会发生碰撞,这样那些不能碰撞的东西就不会有更昂贵的窄相位碰撞检测运行。

根据我的经验,法西耶的events并没有设计得那么好。我发现我不得不为我自己的游戏修改它们--但幸运的是,这段代码实际上并不难阅读和修改。此外,有些地方的文档并不准确。

下面是Farseer物理中所做的事情:

BeforeCollision发生在宽相位注册一个新的潜在冲突之前,然后为这两个固定装置创建一个Contact对象。可以通过在事件处理程序中返回Contact来阻止false的创建。

Contact的存在并不一定意味着这两个固定装置实际上是接触的-只是广义的阶段成功了。Contact可以是触摸/不接触,也可以是启用/禁用(它们开始启用和不触摸)。

当一个OnCollision从不接触变为触摸时,Contact就会发生.您可以通过返回false来禁用联系人。奇怪的是,如果返回true,您可以重新启用另一个事件处理程序在该步骤中禁用的联系人(这是我为自己的游戏更改的内容之一)。

只有一个启用的,触摸接触对物理模拟有任何影响。

OnSeparationOnCollision正好相反:当触点从接触变为不接触时,它就会触发。这里没有办法禁用/启用联系人。

在该框架上参与物理模拟的每个Contact都需要使用AfterCollision (所以:那些启用、触摸、而不是在一个沉睡的岛屿上)。它在物理模拟步骤之后被调用,但在清理之前--最显著的是在Body.ForceBody.Torque被清除之前(便于声音效果等等)。

通常你只是利用这些事件来触发你的效果-粒子,声音,游戏机制,比如摧毁物体,等等。在这种情况下,您订阅任何您想要的,做任何您喜欢的,然后返回true (而不是禁用/覆盖联系人)。

如果您想要处理物理引擎或禁用联系人(特别是当您可以意外地重新启用它们,使用另一个事件处理程序时,正如我前面提到的那样),它会变得复杂得多。如果Farseer的内置事件不适合您,那么进入它的代码并添加您自己的代码是完全合理的。在这一高级水平上,这实际上是一种从源头构建的必要性,这样你就可以准确地检查到底发生了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13393945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档