- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Farseer 已经有一段时间了,从事物理教学平台项目。我脑子里有几个关于引擎的问题很长一段时间都没有得到解答,其中很多是关于引擎的碰撞处理。
许多人似乎无法理解引擎的工作原理,部分原因是 Farseer 缺少合适的 API。对于知情人士来说,确认以下概念并杀死任何错误的概念可能是个好主意。
Farseer 中的碰撞分为两个阶段:
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
了解哪些固定装置对可能发生碰撞对我们有用的常见情况有哪些?
两个关键字的定义:
BeforeCollision 表示两个对象没有碰撞并且没有接触。
OnCollision 表示两个对象正在碰撞,但接触不会触发此事件。
AfterCollision 表示两个对象正在碰撞,但现在它们只是接触。
OnSeparation 表示两个对象接触,但现在它们没有接触。
宽相碰撞测试和精确碰撞测试始终进行。
可以通过在事件 OnCollision 中返回 false 或使用 IgnoreCollision 方法来禁用精确碰撞。
我不止一次听到人们说“让 OnCollision 为空并返回 true”。这到底是什么意思?使用事件意味着我们希望在上述事件发生时应用额外的效果(例如杀死敌人、得分、播放声音等)。
最佳答案
此答案适用于 Farseer Physics 3.3.1(撰写本文时的当前稳定版本)
Broad-phase 只是一种性能优化。它可以快速确定什么可以碰撞,这样不能碰撞的东西就不会运行更昂贵的窄相碰撞检测。
根据我的经验,Farseer 中的事件 设计得并不尽如人意。我发现我不得不为我自己的游戏修改它们 - 但幸运的是这段代码实际上并不难阅读和修改。此外,该文档在一些地方并不准确。
BeforeCollision
发生在 broad-phase 注册一个新的潜在碰撞时,在它创建一个Contact
对象之前两个固定装置。您可以通过在事件处理程序中返回 false
来阻止创建 Contact
。
Contact
的存在并不一定意味着这两个 fixture 实际上 处于接触状态 - 只是 broad phase 成功了。 Contact
可以触摸/不触摸,也可以启用/禁用(它们开始时启用但不触摸)。
OnCollision
当 Contact
从不接触变为接触时发生。您可以通过返回 false 来禁用联系人。奇怪的是,如果您返回 true,您可以重新启用另一个事件处理程序在该步骤中禁用的联系人(这是我为自己的游戏所做的更改之一)。
只有启用的触摸接触才会对物理模拟产生任何影响。
OnSeparation
与 OnCollision
相反:当接触从接触变为非接触时触发。无法在此处禁用/启用联系人。
AfterCollision
为该帧物理模拟中涉及的每个 Contact
调用(因此:启用、触摸、而不是在一个沉睡的岛上)。它在物理模拟步骤之后,但在清理之前调用 - 最值得注意的是在 Body.Force
和 Body.Torque
被清除之前(方便声音效果等) .
通常,您只需使用这些事件来触发您的效果 - 粒子、声音、游戏机制(如摧毁物体)等等。在这种情况下,您可以订阅任何一个您想要的,做任何您喜欢的事情,然后返回 true(而不是禁用/覆盖联系人)。
如果您想扰乱物理引擎或禁用触点(特别是当您可能不小心重新启用它们时,使用另一个事件处理程序,如前所述),事情会变得更加复杂。如果 Farseer 的内置事件对您不起作用,那么进入其代码并添加您自己的事件是完全合理的。在这个高级级别,实际上有必要从源代码构建,这样您就可以准确地检查到底发生了什么。
关于c# - 概念检查器 : Collision situations in Farseer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13393945/
我用 Java 创建了一个简单的 2d 物理引擎,它使用圆形射弹和直墙。目前,每一帧,每个射弹的位置都会提前velocity * (1/fps) .速度随后更新,每帧一次。碰撞检测使用先前和当前位置以
我有一个 CollisionHandler 类,它有 OnCollisionEnter 方法。游戏中的每个 collideable 实体都有 CollisionHandler 作为组件。因此,当 2
我目前正在编写像 Breakout 这样的游戏,我想知道如何正确地将球从表面上弹开。 我采用了将速度旋转 90 度的幼稚方式,即: [vx, vy] -> [-vy, vx] 哪个(不出所料)效果不佳
这个问题一定存在于某个地方,但我不确定它会被称为什么。 在高度图之后,存在直角三角形地形。每个三角形的每个点都从高度图中获取其高度 (y)。 如果角色位于一组特定的坐标,您可以计算出他们在哪个三角形中
我正在做一个2D滚动大理石的项目。我可以检测出大理石何时撞到了盒子的角落,但是我无法弄清楚大理石在撞到角落时应该有什么行为。我需要弄清楚如何重新放置球,使其不与盒子重叠。通过框到框的碰撞,就像将框彼此
是否可以为实体定义更准确的自定义形状碰撞框而不是矩形?请让我知道是否可行以及如何实现? 最佳答案 当然可以,并且有多种可能的解决方案: Box2D: 是一个很棒的物理引擎,可作为 ImpactJS 的
我正在开发一款 2D 游戏,其中包含高速射弹,这些射弹会撞击高速(并且可能旋转得非常快)的多边形目标对象。我一直在试验和寻找适合我的强大碰撞检测算法。 如果快速旋转不是一个因素(即 0 或慢速旋转),
我正在制作一款平台游戏,其中有玩家和一些 Prop 。为了检查碰撞,我使用了 matterjs collisionactive 函数: this.matter.world.on("collisiona
我已经习惯于使用矩形进行碰撞检测,现在我有点难住了。我正在处理类似菱形的形状,在过去的几个小时里,我一直在试图找出如何检查碰撞。 我尝试检查第一个对象的四个点是否在第二个对象的点内,但这只是一个框(我
最初,两个半径为 R1 和 R2 的非接触球体处于静止状态。 然后在时间 = 0 时分别给它们两个加速度 a1 和 a2。查明他们是否会接触。它们的初始位置分别表示为 (x1,y1,z1) 和 (x2
我目前正在学习使用 LWJGL 和 OpenGL 的 ThinMatrix 3d 游戏开发教程。我正在尝试在我的游戏中实现碰撞检测。我已经准备好检测 AABB 与 AABB 碰撞的代码,但似乎无法弄清
如何在 3D 空间中有效地找到无限线和 AABB 之间的最近点? 我有一个简单的解决方案,它涉及找到距离 AABB 的所有 12 个边缘最近的点,并选择最接近的对,这很有效,但性能不是很好。我的用例需
凹面多边形之间有什么好的检测算法吗?我将不胜感激,到目前为止,我只找到了用于检测凸多边形之间的算法。 最佳答案 您可能会发现this论文很有趣。 关于collision-detection - 凹多边
我在哪里可以阅读更多关于游戏或具有交互性的应用程序的基本 2d 碰撞检测的信息? 编辑:Canvas 游戏的 javascript 怎么样? 最佳答案 要知道的最重要的定理是分离轴定理 (SAT)。基
我最近遇到了 this video并想实现类似的东西。基本方法很明确:我必须对图像进行阈值处理并检查虚拟对象是否与剩余前景发生碰撞。 我不想自己实现物理,而是想使用像 Box2D 这样的引擎。但是,如
我似乎无法让海龟在相互接触时死亡。只有当他们在同一个补丁上时,我才能杀死他们。有这样的功能吗? to killturtles if contact? [die] end 最佳答案 没有,但假设你的乌龟
OBB具有位置(x,y),速度(x,y)和方向(Matrix)。给定定期更新,OBB必须彼此冲突,返回被认为成功的举动的一部分。 我已经看过GPWiki上的Polygon测试-http://gpwik
你究竟是如何实现碰撞检测的?所涉及的费用是多少?不同的平台(c/c++、java、cocoa/iphone、flash、directX)对计算碰撞有不同的优化。最后,是否有库可以为我做这件事,或者我可
我正在尝试在我的物理引擎中赋予形状圆度/曲率。 我知道在数学上定义曲线的各种方法;例如贝塞尔曲线、椭圆等。但是我不确定哪种方法最适合在我的物理引擎中使用,因为必须考虑每种方法的速度、构造可行性和灵 a
我希望您对这个问题提出建议... 为简单起见,我将只考虑 x 轴。 对位置 10 的对象进行成像,其宽度也是 10 个单位,每秒向前移动 100 个单位,并且由于低帧,每次更新时它应该移动 80 个单
我是一名优秀的程序员,十分优秀!