6

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

根据签入多维数据集的顺序,当沿多个多维数据集的边缘滑动时,这可能会导致问题。我创建了一个应该解释问题的图表:

http://imgur.com/mmK0W.png

  • 箭头 #1 是玩家的尝试移动。其他箭头是碰撞响应。
  • 在左图中,首先测试与右侧立方体的碰撞,导致玩家被推向左侧,然后向上推。(
  • 在右图中,首先测试与左侧立方体的碰撞,导致玩家被向上推,此时玩家不再与另一个立方体相交。(

关于解决此问题的最有效方法的任何想法可能是什么?或者有什么更好的方法来处理碰撞响应?

谢谢你。

4

4 回答 4

4

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

对于在检查时用户立方体 ( uc )与之相交的每个立方体c1c2 ... ci,您想找出首先“触摸”哪个立方体 - 只有一个,就像在现实生活中一样。考虑uc的方向,并取ci中的uc量(重叠)找到cu在“接触” ci时的位置。d

确定哪个立方体首先被“触摸” cj(需要在d轴上最多回滚的那个 - 时间越早)并仅使用这个来计算碰撞反应。

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

于 2010-10-11T01:33:16.200 回答
0

从您的图表中,您似乎想要最小化玩家和立方体之间重叠的最小移动。每个有重叠的立方体都会尝试在两个正交方向上“推动”玩家。你能做一些事情,比如在每个方向上选择最大推动力中的最小推动力吗?

于 2010-10-11T00:33:01.160 回答
0

当您连续的两个(或更多)静止立方体可以组合成一个更大的矩形时,您可能会实施一种混合广泛阶段。首先测试较大的矩形。它会给你绿色复选标记的结果,并且比检查每个立方体更快。然后,在那之后,只有在你需要的时候,才检查各个多维数据集。

于 2010-10-11T01:43:15.790 回答
0

碰撞只能在 1 个轴上推动对象。要确定要推动的轴:

else   -- not this
elseif -- change to this

if w > h then
    push x
elseif h > w then
    push y
end

如果您的瓷砖对齐,这将有效。

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

于 2016-05-24T22:40:03.010 回答