gpt4 book ai didi

algorithm - 扫掠 AABB 碰撞的伪代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:43 28 4
gpt4 key购买 nike

我认为扫过意味着确定物体是否会在某个时刻发生碰撞,而不仅仅是它们当前是否正在碰撞,但如果我错了请告诉我。

我有带边界框的对象,它们在轴上对齐。物体的盒子可以有不同的大小,但它们总是矩形的。

我已经尝试并尝试找出一种算法来确定两个移动的 AABB 对象是否会在某个时刻发生碰撞,但我真的很难过。我在这里读到一个关于确定两个物体在某个时间点耗时间隔的问题,我在想象它时没有问题,但实现它是另一回事。好像异常太多了,好像我做的不太对。

物体只能沿直线移动(虽然显然它们可以改变方向,例如转身,但它们始终在轴上。如果它们试图关闭轴则它就不起作用),并绑定(bind)到轴上。他们的边界框不会旋转或做任何类似的事情。速度可以改变,但这无关紧要,因为该方法的重点是确定给定对象的当前状态,它们是否处于“碰撞过程”。如果您需要更多信息,请告诉我。

如果有人可以提供一些伪代码(或真实代码)那就太好了。我读了一份名为 Intersection of Convex Objects: The Method of Separating Axes 的文件但是我没看懂其中的一些伪代码(Union是什么意思)?

感谢任何帮助,谢谢。

最佳答案

当发生碰撞时,盒子将在一侧接触。您可以检查它们是否会接触成对的边(LR、RL、UD、DU)。

如果可以简化问题,您可以平移这些框,使第一个框位于原点并且不会移动。

类似于下面的代码:

dLR = B.L - A.R;
dRL = A.L - B.R;
dUD = B.U - A.D;
dDU = A.U - B.D;

vX = A.xV - B.xV;
vY = A.yV - B.yV;

tLR = dLR / vX;
tRL =-dRL / vX;
tUD = dUD / vY;
tDU =-dDU / vY;

hY = dUD + dDU; //combined height
hX = dLR + dRL;

if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true;
if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true;
if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true;
if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true;
return false;

关于algorithm - 扫掠 AABB 碰撞的伪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384743/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com