数学/物理专业人士的最近接问题

7
我正在使用一种分段接近方法,它将输出两个长度段之间的最短距离。每个段对应一个球体对象的起点和终点。速度是从一个点到另一个点的简单移动。
即使没有真正的碰撞,最接近的方法也可以成功。因此,我目前使用了一个10步方法,并计算在两个段上移动的2个球体之间的距离。因此,每个段的长度都是物理步骤中对象的遍历,半径是对象的半径。通过步进,我可以知道它们何时相撞,以及它们是否相撞(在大多数情况下)。
我感觉可能有更好的方法。虽然我认为第一个最接近的调用是必需的,但我认为紧随其后的方法有些弱。有人能帮帮我吗?如果需要,我可以说明这一点。

非常感谢!alt text
(来源:yfrog.com)


但这不是一个编程问题... >_o - rlb.usa
Closest Approach 是一种算法。它非常地是我的朋友。 - Kalen
如果他正在开发物理引擎,那么这很有可能。 - Nathan Osman
@rlb.usa: 我想这可能是关于碰撞检测的问题……只是不完全清楚确切的问题是什么。 - Cascabel
@Kyle:我认为我们在这里缺失的关键是你拥有的输入概念。你说“变速”——变速是否是一个已知函数,这样你就可以使用逼近方法来找到最接近点(甚至直接发生碰撞)?还是说它是未知的,所以你真的必须一步一步地走? - Cascabel
显示剩余10条评论
2个回答

3

(我不知道如何发布图形,请耐心等待。)

好的,我们有两个半径分别为r1和r2的球体,从位置X1和X2开始,速度为V1和V2移动(X和V是向量)。

从球体2看到的球体1的速度为

V = V1-V2

它的方向是

v = V/|V|

球体1在球体2的参考系中行进的最短距离是
s = Xv

如果X是初始分离距离,则最接近距离为:
h = |X - Xv|

这就是图形能够帮助解决问题的地方。如果r1+r2,那么就不会发生碰撞。假设h<r1+r2。在碰撞时,两个球体的中心和最接近点将形成一个直角三角形。从Sphere 1的中心到最接近点的距离为:

u = sqrt((r1 + r2)^2 - h^2)

所以,距离球1行驶的距离是:
s - u

现在只需看看球1是否在给定的时间间隔内走了那么远。如果是,那么你就知道球的碰撞时间和位置(你需要从球2的参考系中进行转换,但这很容易)。如果没有,那么就没有碰撞发生。


谢谢,Beta!我猜我不确定 Xv 中的 X 代表什么,以及你正在进行什么操作。所以,我想我卡在了这个特定的部分。 - Kalen
抱歉,X是球体的初始分离量(X2 - X1),v是指向V方向的单位向量,并且当我将两个向量写在一起像Xv时,我的意思是点积。 - Beta

3

如果位置函数是可逆和显式的,则可以在不模拟时间的情况下进行最近接方法。

  1. 选择路径和对象。
  2. 找到路径上两个路径最近的点。如果时间有限制(例如,路径为线段),则在此步骤中忽略限制。
  3. 找到物体在前一步中的位置的时间。
  4. 如果时间有限制,请将选定的时间限制在范围内。
  5. 计算先前步骤中的时间时其他对象的位置。
  6. 检查对象是否重叠。

这对于所有路径都不起作用(例如,某些三次路径),但对于线性路径应该有效。


在两个物体沿着形成“V”形的两个线段移动的情况下,它们起点位于V字形的顶部,它们的实际碰撞点不会是最接近的交点,而是由于它们的半径而在最接近交点之前。 - Kalen
因此,基于这个原因,我仅使用CA作为布尔检查来执行子步骤。 - Kalen
@Kyle:对于线段而不是直线,你可以找到其中一个线段上离另一个线段最近的点。 - outis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接