什么是AABB?真正碰撞检测之前的预览碰撞之王(我的意思是,准确的)?
我显示了调试形状并设置了b2DebugDraw.e_aabbBit
标志,以便查看它的运行情况。我放了一个简单的盒子落下,当盒子落地的时候,AABB车架就完全不一样了。
什么是AABB?真正碰撞检测之前的预览碰撞之王(我的意思是,准确的)?
我显示了调试形状并设置了b2DebugDraw.e_aabbBit
标志,以便查看它的运行情况。我放了一个简单的盒子落下,当盒子落地的时候,AABB车架就完全不一样了。
我认为另一位受访者已经谈到了 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 时,它:
void b2AABB::Combine(const b2AABB& aabb1, const b2AABB& aabb2)
),最后broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement)
了一些预测空间。至于为什么具体绘制的 AABB 可能更大且形状不同:步骤 3 通常会导致 AABB 扩大以容纳子形状的大部分整个扫描,而步骤 4 会导致 AABB 在所有方面进一步扩展b2_aabbExtension
并沿行进方向额外延伸(通过b2_aabbMultiplier * displacement
)。
希望这可以帮助!
好吧,轴对齐的边界框是一个......简单的框:) 虽然你没有给我任何关于你的项目的基础知识。无论如何,边界框只是一个数学框,可以在三个维度上描述任何身体。
试着用许多盒子包裹你的身体,你会发现它足以涵盖所有物理。由于其简单性,它在游戏中大量使用。你可以在球体模型上做同样的事情,但是对于更复杂的形状,你会得到更复杂的数学,然后你会得到更多的过载,这对于当前的 CPU(包括 gpu)来说太多了。
但总的来说,没有什么可以解释的,关于你不需要一些数学。这是一个简单的盒子,用于比较与另一个 AABB 的碰撞,包括三角形“法线”和“矩阵”变换的帮助。