这让我头疼了几天,所以我终于接受了失败,我将在这里问。
我的游戏由不同大小的立方体组成,必须在一个小区域内移动。我的立方体运动完美运行,我唯一无法理解的是碰撞检测。
地面完全平坦,所以我不需要担心Y轴,立方体的坐标是相对于地面立方体的中心。我还应该补充说,每个级别都由多个矩形地平面组成,这些平面彼此相邻。
欢迎使用最少cpu使用的任何关于如何做到这一点的建议(伪代码很好)。非常感谢。
答案 0 :(得分: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…
}
或者您可以使用更适合的边界框,因为上面的边界框不准确,因为您使用的是立方体并且它们是轴对齐的。
这里的过程也相当简单:如果每个立方体的最小值和最大值彼此相等,则会发生碰撞。即碰撞如果:
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
找到其他立方体的值并运行上面的等式,你应该知道你是否有碰撞。
为了处理碰撞,您需要先将立方体移回框架然后让它们反弹,我认为如果您不先将框架向后移动,则可能会卡在彼此内部。 / p>
为节省CPU使用率,您可以使用着色器将计算结果发送到GPU,但这是一个不同的主题