1

什么是AABB?真正碰撞检测之前的预览碰撞之王(我的意思是,准确的)?

我显示了调试形状并设置了b2DebugDraw.e_aabbBit标志,以便查看它的运行情况。我放了一个简单的盒子落下,当盒子落地的时候,AABB车架就完全不一样了。

在此处输入图像描述

4

2 回答 2

2

我认为另一位受访者已经谈到了 AABB 是什么。通过解释为什么您绘制的 AABB 可能更大且形状不同,此响应增加了他们的答案。

此处显示的 AABB 看起来像是针对已放置在绿色表面上的正方形计算的 AABB 。这至少可以解释为什么 AABB 更大以及为什么 AABB 的形状不同。

这就是为什么...

虽然 AABB 可以用作任何形状的最小封闭轴对齐边界框,但 Box2D 还使用 AABB,其中包含一些运动和一些额外的摆动空间以供未来运动使用。

举个void b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf)例子。在这里,Box2D 使用形状ComputeAABB方法计算 AABB,基本上只是计算最小外壳。当第一次创建一个新的fixture(任何形状可能由1个或多个称为“child”shapes的子shapes)时,每个“child”shapes都会调用这个方法。

OTOH,看看void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2)。这个方法是通过调用 world step 方法来调用的,该方法为所有可能已经移动的物体调用它。在计算 AABB 时,它:

  1. 计算每个子形状所在位置的 AABB,
  2. 计算每个子形状到达的位置(在该步骤中)的 AABB,
  3. 将每个子形状的两个 AABB 组合成“代理”AABB(参见 参考资料void b2AABB::Combine(const b2AABB& aabb1, const b2AABB& aabb2)),最后
  4. 这为每个 AABB增加broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement)了一些预测空间。

至于为什么具体绘制的 AABB 可能更大且形状不同:步骤 3 通常会导致 AABB 扩大以容纳子形状的大部分整个扫描,而步骤 4 会导致 AABB 在所有方面进一步扩展b2_aabbExtension并沿行进方向额外延伸(通过b2_aabbMultiplier * displacement)。

希望这可以帮助!

于 2017-12-04T18:47:49.293 回答
0

好吧,轴对齐的边界框是一个......简单的框:) 虽然你没有给我任何关于你的项目的基础知识。无论如何,边界框只是一个数学框,可以在三个维度上描述任何身体。

试着用许多盒子包裹你的身体,你会发现它足以涵盖所有物理。由于其简单性,它在游戏中大量使用。你可以在球体模型上做同样的事情,但是对于更复杂的形状,你会得到更复杂的数学,然后你会得到更多的过载,这对于当前的 CPU(包括 gpu)来说太多了。

但总的来说,没有什么可以解释的,关于你不需要一些数学。这是一个简单的盒子,用于比较与另一个 AABB 的碰撞,包括三角形“法线”和“矩阵”变换的帮助。

于 2013-09-08T23:14:47.237 回答