我花了一些时间浏览物理引擎的Java源代码,如Box2D,Phys2D(2D)和JBullet(3D)。
我观察到,当刚体移动并在每一步中发生变异时,附着在它们上面的碰撞形状不是。相反,它们始终位于坐标原点附近。 当检查两个刚体碰撞时,一个"翻译"从每个对象中取出对象,并用于将两个已检查形状的顶点(或其他定义属性,具体取决于形状类型)转换为其附件的即时世界位置。然后,这些信息用于检测碰撞并对其作出反应。
我已经得出结论,主要目的是,您可以为多个实体重复使用相同的形状实例,因为它们在所描述的场景中是无状态的,并且可以节省一些内存,因为所需的信息是即时计算的。每一步。
但是,我目前看到更多优势在于改变形状的位置属性,就像它们的成员值一样。每个形状的aabb和顶点将在每个步骤中改变一次,因此当将一个形状与多个其他形状相交时,您不需要多次计算相同的顶点。 另外,您还可以更改形状的区域属性(损坏变形),因为它仅由一个主体使用。
所以问题是:
为什么使用位置不可变的碰撞形状而不是可变的碰撞形状是常见的?