当涉及到像立方体或球形物体时,碰撞检测非常简单。
可以使用球形碰撞检测方法,即在立方体周围绘制虚拟球体,然后检查两个球体中心点之间的距离是否小于球体半径。如下所示:
float x, y, z;
x = SmallModel->GetX() - LargeModel->GetX();
y = SmallModel->GetY() - LargeModel->GetY();
z = SmallModel->GetZ() - LargeModel->GetZ();
float collisionDist = sqrt( x*x + y*y + z*z );
if (collisionDist < sphereRadius)
{
// Collision occurred…
}
或者您可以使用边界框,这更适合此处,因为上述方法不够准确,而边界框将是精确的,因为您正在使用立方体并且它们是轴对齐的。
这里的过程也相当简单:如果每个立方体的最小值和最大值彼此之间存在重叠,则发生碰撞。即:
如果 min(x1) <= max(x2) and max(x1) >= min(x2) and min(y1) <= max(y2) and max(y1) >= min(y2) and min(z1) <= max(z2) and max(z1) >= min(z2),则发生碰撞。
Cube1XMin > Cube2XMin && Cube1XMax < Cube2XMax &&
Cube1YMin > Cube2YMin && Cube1YMax < Cube2YMax &&
Cube1ZMin > Cube2ZMin && Cube1ZMax < Cube2ZMax
因此,对于每个立方体,您需要像上面那样声明6个变量,并且这些最小值和最大值是通过首先知道立方体的大小,其次知道立方体位置来确定的。
因此,如果一个立方体是10 * 10 * 10并位于100,0,100,
则
xmin = 95
ymin = -5
zmin = 95
xmax = 105
ymax = 5
zmax = 105
找到其他立方体的值并运行上述方程,您应该可以发现是否存在碰撞。
为了处理碰撞,您需要将立方体移回到之前的框架,然后可能让它们反弹。我认为,如果您不先将它们移回一帧,则可能会互相卡住。
为了节省CPU使用率,您可能可以使用着色器将计算发送到GPU,但这是另一个话题。