通过在XNA中滑动平面进行碰撞检测

Bev*_*vin 6 c# xna collision-detection

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

绿线是玩家的运动矢量.当玩家在其中一个立方体的平面上刷牙时,我希望矢量变为与平面垂直的矢量.但是,矢量应该保持它在平面方向上的所有速度,但是会失去朝向平面的所有速度.

我希望我的问题清楚.实现这样的碰撞检测系统的最佳和最有效的方法是什么?此外,这样的系统是否允许简单的重力组件?

编辑:忘记提及,立方体存储在三维数组中,[x,y,z].

Chr*_*lor 1

实现这一点的一个简单方法是检测球和飞机的碰撞。计算穿透深度,这是球实际穿过平面的距离,并将球沿平面法线方向推回。

这将产生将球放在平面上的效果。如果对每一帧都执行此操作,球将有效地沿平面滑动,当然假设球的速度矢量并非不平行于平面的法线。

碰撞检测领域广阔而复杂,根据您的游戏,您必须确定什么足以满足您所需的真实感水平和性能要求。您应该始终寻求最简单的解决方案,以提供足够真实的反馈,具体取决于游戏,它通常不必是完美的。

基本上,您应该将碰撞检测分为两个阶段,通常称为宽阶段和窄阶段。

宽阶段可以很简单,只需执行快速边界框检查以确定潜在的碰撞,然后将这些潜在碰撞提交给窄阶段碰撞检测,以进行更详细的检查,确定是否确实存在碰撞以及碰撞深度。如果您有许多对象,那么广泛阶段可能会使用某种四叉树索引来仅选择对象附近的块来执行碰撞检测。