安卓OpenGL ES碰撞检测

3
这几天我一直在苦恼,现在终于想通了请求帮助。
我的游戏包括不同大小的立方体,在一个小区域内移动。我已经完美地解决了立方体的移动问题,但是我似乎无法理解碰撞检测。
地面是完全平坦的,因此我不需要担心Y轴,立方体的坐标是相对于地面上的立方体中心的。我还应该补充说明的是,每个关卡由多个矩形地面组成,它们相互毗邻。
如何以最小的CPU使用量完成此操作(伪代码即可),欢迎提出任何建议。非常感谢。

1
OpenGL ES只处理绘图。没有其他功能。您没有清楚地指定这是2D还是3D游戏。在具有更多相关性的论坛上找到了这个链接:http://gamedev.stackexchange.com/questions/5906/collision-resolution。 - Morrison Chang
抱歉,它是3D的,但物体在任何时候都不会从Y轴的0点移动。 - user3866355
这个问题似乎不适合这里,因为它属于GameDev.SE。 - Kromster
1个回答

4

当涉及到像立方体或球形物体时,碰撞检测非常简单。

可以使用球形碰撞检测方法,即在立方体周围绘制虚拟球体,然后检查两个球体中心点之间的距离是否小于球体半径。如下所示:

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,但这是另一个话题。

谢谢,这帮了我很多。 - user3866355

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接