什么是AABB?需要说明

时间:2013-09-08 22:54:03

标签: actionscript-3 box2d

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

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

enter image description here

2 个答案:

答案 0 :(得分:0)

嗯,轴对齐的边界框是一个......简单的框:)你没有给我任何关于你的项目的基础知识。无论如何,边界框只是一个数学框,能够描述三维的任何物理体。

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

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

答案 1 :(得分:0)

我认为另一位受访者已经解决了AABB的问题。这个回答通过解释为什么你所绘制的AABB可能更大且形状各异而增加了他们的答案。

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

这就是为什么......

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

void b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf)为例。这里Box2D使用形状的ComputeAABB方法计算AABB,它基本上只计算最小的封闭空间。每个"孩子都会调用此方法。首次创建新夹具时的形状(任何形状可能由一个或多个被称为"子"形状)的子形状组成。

OTOH,看看void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2)。通过调用world步骤方法调用此方法,该方法为可能已移动的所有实体调用它。当它计算AABB时,它:

  1. 计算每个儿童形状的AABB,
  2. 计算每个儿童形状所在的AABB(在该步骤中),
  3. 将每个儿童形状的两个AABB组合成"代理" AABB(见void b2AABB::Combine(const b2AABB& aabb1, const b2AABB& aabb2)),最后
  4. 调用broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement),为每个AABB添加一些预测空间。
  5. 至于为什么特定的AABB绘制可能更大且形状不同:步骤3经常导致AABB放大以保持儿童形状的整个扫描的大部分,并且步骤4导致AABB“AABB”。各方进一步扩展b2_aabbExtension,并在旅行方向上进一步扩展(b2_aabbMultiplier * displacement)。

    希望这有帮助!