在那一天,我正在创建自己的第一个3D游戏,但遇到了一些问题。
我从中了解到AABB交叉路口和建立树木的想法,但是
我无法理解的一件事是,如果我的“角色”在游戏中旋转,则不会保留“轴对齐”的概念!
我检查了几个库(例如oz-collide,OPCODE等),并且看到实现是针对静态对象进行的,因为它使用的框没有源(对于非静态,所有节点每次移动后都应更新树中的)。
这些库应该是超快速的,我可能在某个地方弄错了。
有人可以帮我解决一下这个话题吗?
最佳答案
遗憾的是,如果角色旋转,则需要重新计算AABB,也不一定很合适。如果您有一个矩形并旋转它,以使其不再是矩形,则AABB将大于该对象。
AABB之所以快速,是因为相交测试非常简单,但是正如您已经发现的那样,当需要在未与AABB轴对齐的对象上需要精确的相交时,它就会成为问题。
AABB对于快速测试仍然有用,我怀疑这些树木是为制造这些树木而设计的。借助AABB树,您可以从更精确的测试阶段中快速消除大量物体。如果查询返回了几个额外的对象,那就没关系了。在轮换角色的情况下,这可能意味着您的角色实际上不在某个区域时就被视为该角色。
AABB树很容易做到这一点,因为每次通过测试时,您都会更深入地了解树并获得更多细节。
当您需要非常精确的交点时,可以使用“定向边界框”(OBB)。可以用separating axis theorem来实现。我看到oz-collide已经支持OBB。
OBB上有很多资源,这对我有帮助:
GPWiki on separating axis theorem
这是implementation。
如果需要,您可以从OBB计算AABB。
关于collision-detection - 游戏中具有可移动和可旋转角色/对象/等的AABB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4102602/