Questions tagged «collision-detection»

碰撞检测是确定两个或多个实体在游戏过程中是否相互接触。

3
建立一个Plattformer-如何确定玩家是否被允许跳楼?
我正在构建一个简单的Plattformer Jump n'Run Style游戏。我不使用图块-而是为自己的关卡实体使用了几何形状(玩家也是如此)。我已经完成了碰撞检测代码,到目前为止一切正常。 接下来,我想实现跳跃。只需检查玩家是否按下适当的键并增加一些向上的速度即可。工作良好。但是即使播放器在空中也可以使用,这不是我想要的。;-) 因此,我必须检查玩家是否站立。我的第一个想法是检查最后一帧是否发生碰撞,并将玩家标记为“可以跳跃”,但是如果玩家在空中撞墙,这甚至会触发。由于我的数学技能不是很好,因此我寻求帮助-甚至提示也将如何实现这一点。 谢谢!

4
“映射”鼠标在屏幕上的位置,以便无论分辨率如何都能进行碰撞检测,是否是个坏主意?
考虑一个默认分辨率为800x600的游戏。带有防碰撞罩的对象放置在大小为800x600的游戏世界中。防撞罩可以检测鼠标何时与它们碰撞。 现在考虑我们将游戏缩放到1024x768(假设我们通过简单地将所有内容渲染到一个图层然后一次放大整个图层来缩放图形)。在此新分辨率下,我们有两个选项可以使与鼠标的碰撞正常进行: A.)将世界缩放到1024x768,并相应缩放每个对象的碰撞蒙版。 B.)将鼠标位置“映射”到原始世界(800x600)。 通过“地图”,我的意思是简单地将鼠标位置缩放到原始800x600的世界上。因此,例如,如果鼠标在屏幕上的位置是(1024,768),则鼠标在世界上的位置是(800,600)。 现在,显然,选项B所需的计算方式更少,并且可能更不容易出现几何错误,但是对我来说,这也感觉有些“骇人听闻”,就像使用此方法会带来无法预料的后果一样,以后将很难解决。 我应该使用哪种方法:A,B或其他?

3
与多个物体碰撞时的碰撞解决
我有静态对象和可移动对象。使用分离轴定理检测碰撞。 例如,在这种情况下,我有两个静态对象(红色): 以及介于两者之间的可移动对象: 我的算法能够计算出其中两个对象之间的碰撞,并且还为碰撞生成了一个完美的分辨率矢量(意味着最小位移矢量)。 因此,例如,当我检查绿色矩形和右红色矩形之间的碰撞时,该算法会吐出一个向量,该向量告诉我如何移动绿色矩形才能解决该碰撞: 请注意,我只是在MSPaint中快速绘制了此图像,因此在该图片中,实际上可能是最小平移矢量将绿色矩形推到顶部,但是在这里我将假定将其推到左侧/权利实际上更短。 解决此问题的一般方法是仅解决每帧一个冲突的冲突,而不是一次解决所有冲突。但就我而言,这将导致触发器: 首先,求解器检测到两个冲突,但仅解决右矩形和绿色矩形之间的冲突: 然后,在下一帧中,它仅检测到左红色矩形和绿色矩形之间的一个碰撞,并解决该碰撞: 如您所见,这实际上并不能解决冲突(例如,通过将绿色矩形推到顶部),而只是在两个状态之间无限地触发器。 我该如何解决?

3
碰撞检测是否总是O(n ^ 2)?
物理引擎是否能够例如通过将彼此靠近的对象分组并检查该组内部而不是与所有对象的碰撞来降低复杂性?(例如,可以通过查看远处物体的速度和与其他物体的距离来将其从一个组中移除)。 如果不是,那么这对于球体(在3d中)或圆盘(在2d中)是否会使碰撞变得微不足道?我应该做一个双循环,还是创建一个成对的数组? 编辑:对于子弹和box2d之类的物理引擎,碰撞检测是否仍为O(N ^ 2)?

3
解决力量冲突
在我的2D物理引擎中,我可以检测到AABB与AABB碰撞,并通过找到最短的穿透矢量并将其添加到AABB的位置来解决它们。 这样做可以将“第一” AABB“推”到第二AABB之外,但根本不处理速度/加速度变化。 如果我在仿真中添加重力加速度,则即使第一动态ABB停在第二静态ABB的顶部,它的速度也会保持增长。最终,速度将变得太大而无法检测到碰撞(动态AABB将落入静态ABB)。 我尝试将分辨率后的速度设置为零,但显然效果不佳,并创建了不切实际的模拟。 我在线阅读了通过手动处理位置或速度不正确来解决冲突的信息。我尝试过实施力量(目前,质量是“硬编码” 1): void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; } void Body::integrate(float mFrameTime) { velocity += acceleration * mFrameTime; position += velocity * mFrameTime; acceleration = {0, 0}; } 如果我在冲突解决期间将最短的穿透向量用作力,则动态AABB将从静态AABB中“弹出”,但在没有重力的情况下其速度永远不会降低,并且将永远移动。 有没有办法施加“临时”力量?一种将第一个ABB推出第二个ABB的力,然后在该AABB不再碰撞时停止作用? 完整的源代码在这里:https : //github.com/SuperV1234/SSVSCollision

5
如何优化顺序重要且碰撞是基于对象组的条件的碰撞引擎?
如果这是您第一次遇到此问题,建议您先阅读下面的更新前部分,然后阅读本部分。 不过,这是问题的综合内容: 基本上,我有一个带有网格空间分区系统的碰撞检测和解决引擎,碰撞顺序和碰撞组很重要。一次必须移动一个身体,然后检测碰撞,然后解决碰撞。如果我一次移动所有物体,然后生成可能的碰撞对,则显然速度更快,但是由于不遵守碰撞顺序,因此分辨率会下降。如果我一次移动一个身体,我将不得不让身体检查碰撞,这将成为一个^ 2问题。将组混合在一起,您可以想象为什么在很多身体上它变得非常慢。 更新:我已经为此付出了很多努力,但是无法优化任何东西。 我成功实现了Will所描述的“绘画”,并将组更改为位集,但这是非常非常小的加速。 我还发现了一个大问题:我的引擎取决于冲突顺序。 我尝试了一种独特的碰撞对生成的实现,该实现肯定可以大大加快一切,但是却破坏了碰撞的顺序。 让我解释: 在我的原始设计中(不生成对),发生这种情况: 一个身体移动 移动后,它会刷新其单元格并使其碰撞到的身体 如果它与需要解决的物体重叠,则解决碰撞 这意味着,如果一个物体移动并撞到墙壁(或任何其他物体),则只有已移动的物体才能解决其碰撞,而另一个物体将不受影响。 这是我想要的行为。 我了解到物理引擎并不常见,但对于复古风格的游戏却有很多优势。 在通常的网格设计(生成唯一对)中,会发生以下情况: 所有身体移动 在所有身体移动之后,刷新所有单元格 生成唯一的碰撞对 对于每对,处理碰撞检测和解决 在这种情况下,同时移动可能会使两个物体重叠,并且它们将同时分解-这有效地使物体“相互推挤”,并破坏了与多个物体的碰撞稳定性 这种行为对于物理引擎是很常见的,但在我的情况下是不可接受的。 我还发现了另一个主要问题(即使在现实情况中不太可能发生): 考虑A,B和W组的身体 A与W和A相撞并解决 B与W和B相撞并下定决心 A对B无能为力 B对A无所作为 可能存在许多A主体和B主体占据同一个单元的情况-在这种情况下,主体之间存在很多不必要的迭代,这些迭代不能相互反应(或仅检测碰撞但不能解决它们) 。 对于占据同一单元的100个物体,这是100 ^ 100次迭代!发生这种情况是因为没有生成唯一对 -但是我无法生成唯一对,否则我将得到我不希望的行为。 有没有一种方法可以优化这种碰撞引擎? 这些是必须遵守的准则: 碰撞顺序非常重要! 身体必须一次移动一个,然后一次检查一个碰撞,然后一次移动一个就解决。 机构必须具有3个群组位组 组:身体所属的组 GroupsToCheck:人体必须检测到碰撞的组 GroupsNoResolve:团体不能解决的碰撞 在某些情况下,我只希望检测到碰撞但不能解决 更新前: 前言:我知道优化此瓶颈不是必需的-引擎已经非常快。但是,出于娱乐和教育目的,我很想找到一种使引擎更快的方法。 我正在创建一个通用的C ++ 2D碰撞检测/响应引擎,重点是灵活性和速度。 这是其架构的非常基本的图: …

5
在某些情况下忽略与某些对象的碰撞
我正在Unity中制作赛车游戏。该车具有增压/硝基加电功能。在增强时,我不想与僵尸相撞,但我确实想与墙壁相撞。 另一方面,我不想忽略与僵尸的碰撞,因为我仍然想对它们进行撞击。 我该如何处理?基本上,我想要的是汽车与某些物体碰撞时不要旋转。

2
如何处理碰撞检测,以便不允许快速的物体穿过墙壁?
我正在创建一个2D横摇射击游戏,但在子弹的碰撞检测方面遇到了一些麻烦。包括项目符号在内的所有事物都是具有自己的多边形/更新方法的对象。 问题在于子弹速度很快,并且以每秒60帧(游戏运行时)的速度,子弹通常会直接跳过一堵墙-因为它在更新间隔内移动的速度超过了墙的宽度-并且继续愉快地前进,因为多边形实际上不会重叠。 我该怎么办?我唯一能想到的就是从旧位置到新位置绘制一条线,并在该位置上进行碰撞检测,但是slick2d文档建议针对碰撞检测使用线图。我该如何解决?

6
如何处理等距碰撞检测?
我想做一个等距的跳跃风格的平台游戏。玩家应该能够跳到地板上方的平台顶部,撞到物体的侧面等。 我将使用2D游戏引擎,所以我不想为未使用的尺寸模拟完整的3D碰撞。 我认为游戏中的对象应使用:X,Y,宽度,高度和Z表示深度。 使用这些值,我应该如何检测冲突?

3
小型高速物体碰撞:避免隧道效应
编辑/更新:我现在最大的问题是步骤3的“ t = ...”等式是一个好主意还是有更好的方法来做到这一点。大多数其他问题已得到部分或完全解决,但没有任何评论或答案真正涉及此问题。同样,对于我可以想到的任何迭代/递归解决方案(下面的注释中有一些建议),可能都需要解析解决方案,速度和距离太大,对象也太小(尽管有一种特殊的迭代/递归解决方案,可以很好地处理此类情况,那么我肯定会接受)。到目前为止,非常感谢您的帮助,你们都很棒,我非常感谢您的想法和帮助! 我正在尝试检测小型高速物体之间的碰撞。在这种情况下,即使以相对较低的速度,也可能非常容易发生隧穿。 射线投射将不起作用,因为这将检测两个高速物体之间的碰撞,而不是一个物体与固定墙之间的碰撞。(除非我误解了射线投射?)性能是一个非常重要的考虑因素。如果可能的话,我想避免对性能造成重大影响。我已经实现了一个功能强大且非常有效的四叉树(http://en.wikipedia.org/wiki/Quadtree),因此,我将按如下所述对其进行修改和使用。 编辑:减少时间间隔将不起作用。此解决方案的速度太高,这意味着性能损失会太大,同时仍会丢失绝大多数隧道碰撞。(例如,我可能有一个大小约为1个单位的对象,其移动速度在每个时间间隔中以百万个单位为单位...) 建议的解决方案: 步骤1: 在每个对象的运动周围创建一个框,然后将这些框输入四叉树以生成可能发生碰撞的初始列表。参见下图(此图显示了一个圆形对象从一个位置移动到另一个位置,并且该移动生成一个矩形,该矩形将被馈送到四叉树中): 步骤2 :(可能要跳过此步骤吗?) 浏览四叉树可能产生的碰撞列表。查看矩形是否在每次可能的碰撞中相交。如果是这样,请继续执行步骤3。 编辑:在下面,肖恩·米德里奇(Sean Middleditch)建议使用扫掠体/胶囊的交点(如果对象是圆形的话)。剩下三个选项:1)完全跳过步骤2。2)按我的方式执行步骤2。3)按肖恩的方式做。肖恩的方法在计算上比我的盒子想法要昂贵,但是它会比我的方法消除更多的误报,从而阻止他们进入最后一步。 任何人都可以根据经验谈谈这三种选择中哪一种是最佳的吗?(我打算将此物理引擎用于其他一些事情,因此我正在寻找一种“一般最佳”的解决方案,该解决方案在各种各样的情况下都能最快地工作,而不仅仅是一个可以轻松衡量哪种解决方案的特定测试用例。是最快的)。 第三步: 使用下面的t =方程,如果判别式(即,平方根下的部分)为负或0,则无碰撞;如果为正,则将t值用作碰撞时间(在此之后,很容易相应地调整位置)。 ..如果两个对象在碰撞后仍继续存在)。方程: t =(-1/2 sqrt((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz)^ 2-4(w ^ 2- 2 w x …

2
尽管使用了Time.deltaTime,但移动似乎与帧速率有关。
我有以下代码来计算在Unity中移动游戏对象所需的转换LateUpdate。据我了解,我对的使用Time.deltaTime应使最终的翻译帧速率独立(请注意CollisionDetection.Move(),仅用于进行射线广播)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

2
如何对由许多小三角形组成的物体执行碰撞检测?
我知道可以通过较小的三角形来创建(或近似)任何形状。任何矩形都可以由2个较小的三角形创建。任何圆形都可以由许多薄的“比萨饼切片”三角形创建。这如何转换为碰撞检测? 我了解如何使用顶点计算矩形重叠。我了解如何使用中心,半径和距离来计算圆重叠。 但是,如何对由小三角形构成的形状进行碰撞检测?不是细节,而是一般概念。

4
更快的2D碰撞检测
最近,我一直在研究快节奏的2D射击游戏,但遇到了一个大问题。碰撞检测。当然可以,但是速度很慢。我的目标是:屏幕上有很多敌人,并且让他们彼此不接触。所有的敌人都在追逐玩家实体。他们中大多数人或多或少都拥有相同的速度,所以迟早他们都在追逐玩家时占据了相同的空间。这确实降低了娱乐性,因为对于玩家而言,似乎您只被一个敌人追赶。为了防止它们占据相同的空间,我添加了一个碰撞检测(一种非常基本的2D检测,这是我所知道的唯一方法)。 Enemy class update method Loop through all enemies (continue; if the loop points at this object) If enemy object intersects with this object Push enemy object away from this enemy object 这很好。只要我只有<200个敌方实体。当我靠近300-350个敌方实体时,我的帧频开始大幅下降。首先,我认为渲染效果很差,因此我取消了他们的平局。这一点都没有帮助,所以我当然意识到这是更新方法。它们更新方法中唯一重要的部分是每个敌人循环通过每个敌人的部分。当我接近300个敌人时,游戏会执行90000(300x300)步发信号。我的我的〜 我确信必须有另一种方法来解决这种冲突检测。虽然我不知道如何。我发现的页面涉及如何实际执行两个对象之间的碰撞或如何检查对象与图块之间的碰撞。我已经知道这两件事。 tl; dr?如何在实体的LOTS之间进行冲突检测? 快速编辑:如果有任何帮助,我正在使用C#XNA。

3
处理物理引擎中的同时碰撞的最佳方法是什么?
我正在用JavaScript编写2D物理引擎,以便可以了解有关视频游戏中物理的更多信息。我可以使它在刚体碰撞中正常工作,除非任何物体同时与两个或多个其他物体碰撞。 目前,对于每对碰撞体(A,B),我会根据碰撞冲量来修改它们的速度和角速度,并将它们相互推开,以使它们不会穿透。但是,对于涉及A的其他碰撞,碰撞检测和脉冲计算将是错误的。 我可以探索什么方法来使我的引擎针对3个以上的对象相互碰撞而工作?

1
如何在图块地图的顶部定义复杂的碰撞区域?
正如许多人所建议的那样,我正在使用Tiled地图编辑器为我的游戏创建地图,这特别棒,因为libgdx框架还提供了Tiled地图的API。 我知道我可以在地图编辑器中定义是否可折叠的图块,这样我就可以处理代码中的任何冲突。但是我目前处于需要将图块划分为可碰撞和不可碰撞区域的情况。我认为可以手动定义两个区域的边界点和界限,并以编程方式处理它。但这是很多耗时的工作。 因此,我在Google上搜索了很多东西,然后找到了这个物理身体编辑器。这似乎是使我上面提到的过程自动化的好工具。但是,该系统可以处理每个解压缩的图像,即使将图像解压缩以进行操作,我也不确定它是否可以正常工作。 我想知道是否有更好的方法来完成定义碰撞区域的整个过程。任何建议将不胜感激。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.