我正在尝试为我正在制作的一个自定义的“我的世界”客户端设计一个碰撞检测算法。基本上,整个世界是由立方体组成的,玩家(或相机)需要能够站在这些立方体上移动。我想要的结果如下图所示:

绿线是玩家的移动矢量。当玩家与其中一个立方体的平面擦肩而过时,我希望向量变为与平面垂直的向量。然而,矢量应该保持它在平面方向上的所有速度,同时失去朝向平面的所有速度。
我希望我的问题已经说得很清楚了。实现这样的碰撞检测系统的最佳和最有效的方法是什么?另外,像这样的系统会允许一个简单的重力分量吗?
编辑:忘记提到,立方体存储在一个三维数组中,x,y,z。
发布于 2011-01-15 03:03:36
实现这一点的一种简单方法是检测球和平面的碰撞。计算穿透深度,这是球实际穿过平面的距离,并将球推回平面的法线方向。
这将具有将球放置在平面表面上的效果。如果对每个帧执行此操作,球将有效地沿平面滑动,当然,假设球的速度向量与平面的法线不平行。
碰撞检测的领域既大又复杂,根据您的游戏,您必须根据您需要的真实感级别和性能要求来确定什么才能满足您的需求。你应该总是选择最简单的解决方案,给出足够现实的反馈,这取决于游戏通常不一定是完美的。
基本上,您应该将碰撞检测分为两个阶段,通常称为宽阶段和窄阶段。
宽阶段可以像执行快速边界框检查以确定潜在冲突一样简单,然后将这些潜在冲突提交给窄阶段冲突检测,以执行更详细的检查,其中您可以确定是否确实存在冲突和冲突深度。如果您有许多对象,那么宽泛的阶段可能会使用某种类型的四叉树索引,以仅选择对象附近的块来执行碰撞检测。
发布于 2011-01-16 04:40:10
在轴对齐立方体的世界中,这真的很容易。很容易认为你需要一些精致的东西,但实际上它真的很简单。这是在写完我自己的“我的世界”之后的经验。
下面是操作步骤:
position.X += velocity.X;
if(colliding())
position.X -= velocity.X;
position.Y += velocity.Y;
if(colliding())
position.Y -= velocity.Y;
position.Z += velocity.Z;
if(colliding())
position.Z -= velocity.Z;以下是用于确定是否发生碰撞的代码:
bool colliding()
{
int minX = Position.X - size.X / 2;
int minY = Position.Y - size.Y / 2;
int minZ = Position.Z - size.Z / 2;
int maxX = Position.X + size.X / 2;
int maxY = Position.Y + size.Y / 2;
int maxZ = Position.Z + size.Z / 2;
for (int x = minX; x <= maxX; x++)
for (int y = minY; y <= maxY; y++)
for (int z = minZ; z <= maxZ; z++)
{
if(blockType[x, y, z] != 0)
return true;
}
return false;
}https://stackoverflow.com/questions/4694759
复制相似问题