多个物体之间的碰撞

2023-12-30

我正在编写一个简单的物理系统来娱乐,但我遇到了一个让我陷入困境的问题。

现在的基本算法是:

  1. 移动物体
  2. 检查是否有碰撞
  3. If there was a collision
    • 将对象移动最小距离以解决碰撞。
    • 根据法线、质量等调整速度

我有一个移动的物体朝着两个静止的、无质量的物体移动。

移动物体一步平移以与其中一个物体碰撞。

我的反应是找到我可以移动的最小距离,这样它们就不再碰撞。在这种情况下,这意味着将动态主体垂直向下移动。然而,现在它正在与另一个盒子相撞。

我对那个盒子重复同样的事情,尝试移动动态盒子,使其不再碰撞,但这会将它推回到第一个盒子中。这会永远重复。我的算法有根本缺陷吗?


一旦检测到碰撞,最好不要向下移动朝你来的方向走回。这样,如果我们假设初始状态没有碰撞,那么您可以保证最终您一定会处于没有碰撞的状态。

我们需要找出需要缩小多少(缩放)v使其适合对象交集。缩小了的v将具有正确的大小,因此如果我们朝-v到了这个程度,我们就不再相交了。

假设一个交集由一个x_intersection and a y_intersection成分。为了找出我们需要向后移动多少才能不再相交,我们需要缩放原始尺寸v = (v_x, v_y)向量。如果x_intersection是较小的交集然后我们缩放v by x_intersection / v_x并将我们的对象向后移动-v * x_intersection / v_x。这意味着我们向后移动-(x_intersection, x_intersection * v_y/v_x)。如果y_intersection是较小的交集然后我们缩放v by y_intersection / v_y并将我们的物体向后移动-v * y_intersection / v_y = -(y_intersection * v_x/v_y, y_intersection).

所以我想说你的算法中的步骤可能是:

  1. 通过某个移动向量移动对象v
  2. 检查所有碰撞
  3. 如果发生碰撞

    • 对于所有碰撞对象,找到最小缩放比例v我们需要向后移动。该缩放可以计算为两个比率的最小值

      given v = (v_x, v_y)
      min_i = min(x_intersection / v_x, y_intersection / v_y)    
      
    • 找到所有对象的最小缩放比例。

      min_o = min(min_i) for all i
      
    • 将对象沿以最小比例缩放负移动方向获得的矢量方向向后移动。那是v2 = (min_o*-v) where v2是我们用来向后移动的向量。

  4. 返回步骤 2

例如:第一选择w:

然后选择u2:

Done :

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

多个物体之间的碰撞 的相关文章

  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 用于整数分区的优雅 Python 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我尝试编写代码来解决标准整数分区问题 维基百科 http en wikipedia org wiki Partition 28numb
  • Numpy:具有特定条件的线性系统。无负解

    我正在使用 numpy 编写 Python 代码 在我的代码中 我使用 linalg solve 来求解 n 个变量中的 n 个方程的线性系统 当然 解决方案可以是积极的 也可以是消极的 我需要做的是始终有正解或至少等于 0 为此 我首先希
  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • 将整数列表划分为总和相等的 K 个子列表

    类似的问题还有1 https stackoverflow com questions 27322804 partition of a set into k disjoint subsets with equal sum and 2 http
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 错误 itms-90451“CFBundleIdentifier 冲突错误”

    我上传了我的应用程序的一个版本 弹出此错误 并且我的应用程序的 Google 地图部分没有任何更改 我第一次上传时没有任何问题 只需从您的扩展中删除嵌入框架构建阶段即可 单击目标部分中的扩展 gt 构建阶段 gt 删除嵌入 Pod 框架 见
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 序列和与 GCD

    大约一个月前 我在编程挑战中遇到了这个问题 但社论尚未发布 所以我在这里问 有一个大小为 N 的数组 A 求 A 的 K 个长度子序列的总和 GCD Example 如果 A 1 2 3 且 K 2 1 2 3 总和 1 GCD 3 1 3
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 在任意时间范围内找到最佳日/月/年间隔的算法?

    如果您有时间表 请说 March 19 2009 July 15 2011 是否有一种算法可以将该时间范围分解为 March 19 2009 March 31 2009 complete days April 1 2009 December
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • heapq.nlargest 的时间复杂度是多少?

    我在看演讲者说 获得t列表中最大的元素n元素可以在O t n 这怎么可能 我的理解是创建堆将是O n 但是复杂度是多少nlargest本身就是O n t or O t 实际的算法是什么 在这种情况下 说话者是错误的 实际成本是O n log
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • 求先递增后递减列表的最大值和最小值

    我尝试用谷歌搜索这个问题 但没有取得太大成功 我确信这个问题或类似问题有一个技术名称 但我似乎找不到答案 给定一个列表L整数 即严格递增 然后严格递减 找到该列表的最大值和最小值 例如 L可能 1 2 3 4 5 4 3 2 or 2 4
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait

随机推荐