如何处理同时碰撞以使处理顺序无关紧要?

2024-04-21

假设有3个球同时碰撞。我发现解决冲突的顺序会对最终结果产生影响,这当然没有意义。

为了解释和简单起见,考虑 1D 中的 3 个球,质量相同,弹性碰撞。顶部的数字是速度,箭头是方向。假设它们当前都互相接触,即发生碰撞

 -->2   -->1 <---3
   O     O       O
   A     B       C

这表明球 A 从后面击打球 B,球 B 和球 C 正面碰撞。

现在,如果我们首先解决 A 与 B 的碰撞,然后解决 B 与 C 的碰撞,但使用 B 的新速度,如果我们解决了 B 与 C 的碰撞,然后解决 A 与 B 的碰撞,则应该给出相同的结果(使用 B) 的新速度。

但事实并非如此。

第一种情况:A 与 B,然后是 B 与 C

A 与 B 给出

 -->1   -->2
   O     O  
   A     B  

B 和 C 给出(但使用上面的新 B 速度 2,而不是原始速度 1)

 <--3   -->2
   O     O  
   B     C  

因此最终结果是

 -->1   <--3  ---->2
   O     O       O
   A     B       C

第二种情况:B 与 C,然后是 A 与 B

B 与 C 给出

 <--3   --->1
   O     O  
   B     C

A和B(但是使用上面3中B的新速度,而不是原来的1)

<--3    -->2
   O     O  
   A     B  

因此最终结果是

 <--3  -->2   ---->1
   O     O       O
   A     B       C

可以看到最终的状态是不同的。

我究竟做错了什么?更重要的是,处理这个问题的正确方法是什么?

对于许多球的模拟以及与墙壁的碰撞,这种情况是很有可能的。 (例如,球击中墙壁并同时被另一个球击中,会产生与上面相同的问题,顺序给出不同的结果)。

目前,我使用循环来迭代所有对象并一次解决每个对象之间的冲突。因此,我使用的顺序是任意的(顺序只是数组中球的索引)。


您没有做错任何事,但您的碰撞响应尚未完成。 在第一个中,A B 仍在碰撞,在第二个中,B 和 C 仍在碰撞。 所以你应该解决这些冲突。

如果你碰撞你会得到相同的答案A <--3 , B-->1, C-->2

尽管在模拟中,对象可以同时发生碰撞,但实际上它们永远不会发生碰撞。碰撞之间总会有一点时间(可能非常非常短)。 因此,为了简单起见,物理引擎成对解决碰撞。但他们应该这样做,直到所有配对都分开为止。这需要不止一次迭代。如果您尝试模拟堆叠体(如配置),迭代次数可能会变得非常高。

你可以检查

如何对 Guendelman 激波传播的对象进行排序? https://stackoverflow.com/questions/10858871/how-to-sort-objects-for-guendelman-shock-propagation

获取更多信息以减少迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理同时碰撞以使处理顺序无关紧要? 的相关文章

  • Swift Spritekit 我检测到碰撞,但它多次读取碰撞

    AppImage我有一堵由 4 个不同颜色的矩形组成的墙 要穿过这堵墙 球的颜色必须与墙上的矩形的颜色相匹配 球将穿过墙壁 新的墙壁将会出现 然而 当我检测到这种碰撞时 我得到了多个碰撞读数 我已经通过打印死或活来测试这一点 并且它会多次打
  • Java游戏中的碰撞检测?

    我正在开发一款游戏 其中存在运动图像碰撞检测的问题 游戏有一艘宇宙飞船和一些小行星 障碍物 我想检测它们之间的碰撞 我怎样才能做到这一点 对于矩形以外的任何物体 碰撞检测通常都很棘手 我过去这样做的方法是为每个对象提供图像和蒙版 例如 像木
  • 检测点是在 raphael.js 形状的内部还是外部

    我有一个 raphael js 形状 我正在其上绘制圆圈 我只希望当圆没有超出其所绘制的形状的边界时出现一个圆 为了更清楚地说明这一点 以下是我不希望发生的情况的示例 示例http img682 imageshack us img682 4
  • Actionscript 3.0 Flash 中精灵的碰撞检测

    我正在 AS3 0 中制作一个类似 achtung die kurve 的游戏 到目前为止 我已经完成了 4 个不同玩家的动作 效果还不错 我现在要进行碰撞检测 以测试 蠕虫 可以这么说 是否正在相互碰撞或与自己的尾巴碰撞 据我了解 如果我
  • 为迷宫墙添加碰撞

    有人可以帮我向我的精灵添加碰撞点吗 我过去有一个代码 我在图像上分层了位图 但相同的代码不能很好地集成用于物理绘制线条 而不是检测图像上黑色 灰色的位置 import random import pygame pygame init WHI
  • 检测 Cocos2d-iphone 上是否触摸了特定精灵

    我正在按照 Ray 的教程制作一个简单的 iPhone 游戏 此处 http goo gl fwPi 并决定我希望敌人在被触碰时被消灭 我最初的方法是在触摸位置生成一个小的 CCSprite 精灵 然后使用 CGRectMake 创建所述精
  • Three.js - 用于碰撞检测的精确光线投射

    我正在使用 Three js 版本68 我使用与此人在这里使用的相同的方法进行碰撞检测 这在大多数情况下都很棒 向作者表示深深的 感谢 http stemkoski github io Three js Collision Detectio
  • Pygame 使用对象和矩形进行碰撞检测

    是的 我正在问有关该程序的另一个问题 D 不管怎样 我目前有一个程序 可以在屏幕上创建两条线 它们之间有一个可以滚动的间隙 从这里 我显然需要查看两个物体是否发生碰撞 由于我只有一个精灵和一个矩形 我认为为它们创建两个类有点毫无意义和过分
  • 使用OpenCascade,如何快速进行2个形状的碰撞检测?

    使用OpenCascade 如何进行2个形状的碰撞检测 可能有几种方法 一是计算它们的交集 并检查交集结果 另一种方法是计算它们的最小距离 哪种方式更快 或者还有什么更快的方法 多谢 在 brep 数据结构上计算最小距离是一项相当昂贵的操作
  • 测试两条线是否相交 - JavaScript 函数

    我尝试寻找一个 javascript 函数来检测两条线是否相交 该函数将获取每条线 我们将其称为线 A 和线 B 的两个起点的 x y 值 就是如果相交则返回 true 否则返回 false 函数示例 如果答案使用矢量对象 我很高兴 Fun
  • 为 pygame 中的平台添加碰撞检测

    我正在开发一款小型平台游戏 您可以在其中放置块来制作一个关卡 然后玩它 我有重力 跳跃和左右移动 但我不确定如何让玩家在向左或向右移动时与墙壁碰撞 我希望它的工作方式是这样的 if key K LEFT if not block to th
  • 多次检测到碰撞。

    我正在制作一个飞扬的小鸟游戏 当我的鸟经过每堵墙 收集一枚硬币时 我似乎遇到了问题 有2个问题 1 收集后游戏会滞后一毫秒 2 我的鸟似乎每次都会发生 2 次甚至 3 次碰撞 得分为 2 或 3 我无法理解这一点 我的鸟是一个 5 纹理动画
  • 开源、纯Java物理/动力学库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个轻量级的 纯Java 物理引擎来对机器人运动控制进行一些模拟 我的要求 刚体物理 联合约
  • 碰撞后正确附加到游戏对象?

    我怎么能够properly使一个游戏对象在碰撞后附加 或 粘 到另一个游戏对象 问题 我希望游戏对象在碰撞后附加 即使它正在改变比例 碰撞时附加 代码 protected Transform stuckTo null protected V
  • 圆线段碰撞检测算法?

    我有一条从 A 到 B 的线和一个位于 C 处 半径为 R 的圆 有什么好的算法可以用来检查直线是否与圆相交 它发生在沿着圆边缘的什么坐标处 Taking E是射线的起点 L是射线的终点 C是您要测试的球体中心 r是该球体的半径 Compu
  • 快速的射弹并不总是能击中

    因此 对于我的游戏 有一个快速移动的子弹对象 其精灵大小为 5x5 大约 以大约 30 的速度移动 需要撞击厚度仅为 5 像素左右的相对较薄的 Enemy 物体 子弹以一定的固定距离间隔穿过敌人而不会发生碰撞 I think这是因为子弹移动
  • AndEngine:处理与 TMX 对象的碰撞

    我现在设法加载 tmx 地图 我想创建精灵无法移动的障碍 我像这样恢复了障碍 try final TMXLoader tmxLoader new TMXLoader this this mEngine getTextureManager T
  • 打砖块游戏中球和砖块之间的碰撞检测[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在打砖块游戏中如何检测球和砖块之间的碰撞 边界框碰撞 http www gamedev net reference articles
  • 使用 Pygame 检测碰撞点

    我正在用 Pygame 制作游戏 对于这个游戏 我不仅需要能够检测到两个矩形发生碰撞 还需要能够检测到它们之间的碰撞点 我查看了文档 但似乎找不到任何答案 这样的事情可能吗 您可以使用Rect clip https www pygame o
  • 为什么 pygame 上两个移动物体之间的碰撞不起作用?

    我正在用 pygame 做一个蛇游戏 游戏中有两条蛇 我想检测蛇头何时与另一条蛇身体碰撞 对两者都执行此操作 以及当两个头碰撞时的特殊情况 我目前正在做蛇头和另一条蛇身体之间的碰撞 如果其中一条蛇被冻结而另一条蛇在移动 则碰撞效果很好 但如

随机推荐