什么是AABB?真正的碰撞检测之前的预览碰撞之王(我的意思是准确的碰撞)?
我显示了调试形状并设置了b2DebugDraw.e_aabbBit
标志,以便查看它的运行情况。我放了一个简单的盒子,当盒子落地时,AABB框架完全不同。
答案 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时,它:
void b2AABB::Combine(const b2AABB& aabb1, const b2AABB& aabb2)
),最后broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement)
,为每个AABB添加一些预测空间。至于为什么特定的AABB绘制可能更大且形状不同:步骤3经常导致AABB放大以保持儿童形状的整个扫描的大部分,并且步骤4导致AABB“AABB”。各方进一步扩展b2_aabbExtension
,并在旅行方向上进一步扩展(b2_aabbMultiplier * displacement
)。
希望这有帮助!