Math 三维空间盒到盒碰撞预处理

Math 三维空间盒到盒碰撞预处理,math,vector,geometry,collision,intersection,Math,Vector,Geometry,Collision,Intersection,我正在开发一个碰撞预测系统(这里的语言真的是不可逆转的),我正在寻找一种方法来预测两个物体在给定时间后的碰撞。我的变量是: 第一实体 第二实体 第一个和第二个图元边界框的最大和最小XYZ(“最高”角和“最低”角) 第一和第二实体速度(我们假设其为常数) 时间 到目前为止,我尝试的是在给定时间后计算可编辑实体位置,然后在此基础上计算两个实体的点击框最大和最小位置,并检查这些位置是否发生碰撞。虽然我没有使用任何数学公式,因为我没有找到一个,但我这样做的方式包含了很多循环,效率非常低 在Stack

我正在开发一个碰撞预测系统(这里的语言真的是不可逆转的),我正在寻找一种方法来预测两个物体在给定时间后的碰撞。我的变量是:

  • 第一实体
  • 第二实体
  • 第一个和第二个图元边界框的最大和最小XYZ(“最高”角和“最低”角)
  • 第一和第二实体速度(我们假设其为常数)
  • 时间
到目前为止,我尝试的是在给定时间后计算
可编辑实体位置
,然后在此基础上计算两个实体的
点击框最大和最小位置
,并检查这些位置是否发生碰撞。虽然我没有使用任何数学公式,因为我没有找到一个,但我这样做的方式包含了很多循环,效率非常低

在StackOverflow上有一个,但是对于2D碰撞预测,您可以找到它


我想有人帮我把这个扩展到3D空间

我会这样做的。首先,找出两个框的X坐标重叠的时间间隔。可以通过求解t中的两个线性方程来实现这一点,表示X坐标刚刚接触的时间:

  • t时实体1的最小X=t时实体2的最大X
  • t时实体1的最大X=t时实体2的最小X
如果您需要帮助设置该部件,请告诉我

现在,解决Y坐标的相同问题。如果Y的间隔与X的间隔不相交,则框不会碰撞。如果两个区间确实相交,则在相交处继续行驶

解决Z坐标的问题以获得另一个间隔。如果Z的间隔与X和Y的间隔不相交,则框不会碰撞。如果间隔确实相交,则选择相交点

现在您有了一个时间间隔[t1,t2],它表示当框的所有三个坐标重叠时的所有时间点——换句话说,当框重叠时的所有时间点!所以t1是它们碰撞的时间点

(另一种方法是用椭球代替点击框,然后像另一个StackOverflow线程一样求解二次方程。但是,在这种情况下,数学实际上更难。使用轴对齐框意味着可以将问题分解为独立的每个坐标,并坚持线性方程。)

编辑:根据要求,以下是如何设置线性方程组

struct实体
{
浮点x1;//X的最小值
浮点x2;//X的最大值
浮点vx;//以X为单位的速度
//等等。
};
实体1;
实体2;
//查找X坐标重叠的时间间隔。。。
//TODO:处理案例Entity1.vx==Entity2.vx!!!
//求解Entity1.x1+t*Entity1.vx=Entity2.x2+t*Entity2.vx
//t*Entity1.vx-t*Entity2.vx=Entity2.x2-Entity1.x1
//t*(Entity1.vx-Entity2.vx)=Entity2.x2-Entity1.x1
浮点时间xa=(Entity2.x2-Entity1.x1)/(Entity1.vx-Entity2.vx);
//而另一边。。。
//Entity1.x2+t*Entity1.vx=Entity2.x1+t*Entity2.vx
//t*Entity1.vx-t*Entity2.vx=Entity2.x1-Entity1.x2
//t*(Entity1.vx-Entity2.vx)=Entity2.x1-Entity1.x2
浮点时间xb=(Entity2.x1-Entity1.x2)/(Entity1.vx-Entity2.vx);
浮动时间xmin=std::min(timeXa,timeXb);
float timeXMax=std::max(timeXa,timeXb);

然后对Y和Z执行相同的操作,并将时间间隔相交。请注意,我可能犯了一些愚蠢的符号错误,我没有处理等速情况,这可能会导致除以零。您需要在最终代码中进行一些快速的单元测试,以确保它给出合理的结果。

对不起,我一直在度假;)你能帮我解一下线性方程吗?@KamilSolecki是的,这个代码只适用于轴对齐的盒子。如果你想测试两个不同方向的盒子之间的碰撞,这是一个更难的问题。而且,如果物体已经在任何轴上发生碰撞,这也不起作用,对吗?@KamilSolecki不完全确定你在问什么。假设表示碰撞的时间间隔为[tMin,tMax]。如果当前力矩由t=0表示,且方框当前重叠,则tMin<0