Algorithm 滑动AABB碰撞-边缘卡住

Algorithm 滑动AABB碰撞-边缘卡住,algorithm,geometry,collision,game-physics,Algorithm,Geometry,Collision,Game Physics,我正在开发一个基于3D瓷砖的游戏,我正在使用AABB碰撞检测。对于玩家与立方体相交的每个立方体,我找到玩家与立方体相交最少的轴,然后沿着该轴将玩家推出立方体 根据检入多维数据集的顺序,在沿多个多维数据集的边缘滑动时可能会出现问题。我已经创建了一个图表来解释问题: 箭头#1是玩家尝试的移动。其他箭头是碰撞响应 在左图中,首先对右立方体进行碰撞测试,使播放器向左推,然后向上推。(坏的) 在右图中,首先对左立方体进行碰撞测试,导致播放器向上推,此时播放器不再与另一个立方体相交。(好) 有没有关于

我正在开发一个基于3D瓷砖的游戏,我正在使用AABB碰撞检测。对于玩家与立方体相交的每个立方体,我找到玩家与立方体相交最少的轴,然后沿着该轴将玩家推出立方体

根据检入多维数据集的顺序,在沿多个多维数据集的边缘滑动时可能会出现问题。我已经创建了一个图表来解释问题:

  • 箭头#1是玩家尝试的移动。其他箭头是碰撞响应
  • 在左图中,首先对右立方体进行碰撞测试,使播放器向左推,然后向上推。(坏的
  • 在右图中,首先对左立方体进行碰撞测试,导致播放器向上推,此时播放器不再与另一个立方体相交。(
有没有关于解决这个问题最有效的方法的想法?或者有更好的方法来处理碰撞响应


谢谢。

从您的示意图来看,您似乎想要最小的移动,以最小化播放器和立方体之间的重叠。每个有重叠的立方体将尝试在两个正交方向上“推”玩家。你能在每个方向上选择最大推力中的最小推力吗?

一个离散的实现迫使你在系统中注入一些连续的数学,只有在需要时(立方体/方向重叠)

对于每个立方体c1,c2。。。用户多维数据集(uc)在检查时与之相交的ci,您希望找出哪个多维数据集是首先“接触”的-只有一个,就像在现实生活中一样。考虑UC的方向<代码> d <代码>,并在CI(重叠)中取UC的数量,找到Cu在“触摸”CI时的位置。< /P> 确定第一个cj“接触”了哪个立方体(在
d
轴上需要最多回滚的立方体-时间越早),并仅使用此立方体计算碰撞反应


不仅你能达到准确度。但是如果所有的立方体都在移动,速度不同等等,这会有所帮助。

当一行中的两个(或更多)静止立方体可以组合成一个更大的矩形时,您可能会实现一种混合宽相位。首先对较大的矩形进行测试。它将为您提供绿色复选标记的结果,并且无论如何比检查每个立方体都要快。然后,在这之后,仅当需要时,才检查单个立方体。

碰撞只能将对象推到一个轴上。要确定要推动的轴,请执行以下操作:

else   -- not this
elseif -- change to this

if w > h then
    push x
elseif h > w then
    push y
end
如果瓷砖对齐,则此操作有效


使用圆圈避免粘贴在未对齐的瓷砖上

可能会检查所有碰撞并记录碰撞的时间(或距离)。仅应用最快发生的碰撞。可以选择在剩余的时间步中继续此过程。因此,如果我按照与播放器的距离对播放器相交的所有立方体进行排序,然后一次考虑一个立方体,那么这可能会起作用。我认为最好不要在每一帧都对事情进行排序,但我不确定这会有多大影响,因为玩家最多只能与7?一次一个街区。你认为有什么需要担心的吗?我认为如果球员走到角落里,那会引起问题。在这种情况下,我需要沿2轴向后推播放器;在2D中,推力必须具有垂直和水平分量。每个重叠立方体可以从{N,S,E,W}向两个方向施加推力。如果有多个重叠立方体,那么你需要考虑{n,s}和{e,W}方向中的最大推送(任何较少的会留下重叠,但是它可能忽略,比如说NS推送,因为EW推送将完成这项工作)。最多有八种可能。你能按大小顺序尝试所有八个,然后选择第一个将玩家从立方体中清除的集合吗?不幸的是,在三维空间中可能会有更多的集合。根据汤姆的建议,基于距离的初始排序可能更有效。嗯,3D最多有26种可能性,只有当玩家立方体的每一个面与游戏立方体相交时,你才能考虑它们的全部。+ 1。我曾经做过类似的事情,尽管实现和调试起来很痛苦。当对象从一帧到下一帧的运动不是沿着线性线时,使用这种方法可能会遇到麻烦,但在其他情况下,效果非常好。你需要记住每个可以移动的物体之前的位置(可能还有之前的速度),这样你就可以在两帧之间的任何给定时间计算物体的位置和速度。我在理解你说的话时有点困难,但我认为,如果球员试图走进房间的一角,这个答案也会有问题。我认为有必要考虑不止一个街区。我可能会对玩家碰撞的所有块进行排序,但我不确定是否最好避免进行排序。房间的墙壁与其他立方体的处理方式相同-这是一个特殊(更容易)的情况:检查立方体是否超出边界,并使用相同的算法,确定多维数据集有多少未显示,然后检查与其他多维数据集的冲突。同样,第一次“接触”(另一个立方体或墙)必须处理碰撞反应。墙只是一个不移动的更大的物体,立方体可能会与之碰撞。我是说,如果玩家走进角落,他将与3个立方体相交(如果这是2D)。当播放器必须沿两个轴移动时,如何仅使用一个立方体计算适当的响应?我想我必须对它们进行距离排序,并考虑它们中的每一个。虽然我只需要考虑两个