使用OBB进行碰撞滑动

时间:2014-06-30 12:07:48

标签: c# xna collision sliding

在我的C#3D游戏中: 我的墙上有一个OBB(定向边界框)。我的播放器是另一个小小的obb。我有很好的碰撞检测使用SAT(分离轴定理)。当碰撞发生时,我有玩家的旧位置(没有发生碰撞)和玩家经历的位置变化。为了计算我使用的新位置:Position = OldPosition + PositionChange;我还有一个功能,可以检测我在世界上与任何墙碰撞的时间,如果没有碰撞,它将返回null,如果有碰撞,它将返回一个墙。碰撞。 Wall是我添加的一个类,它有一个模型,OBB和位置。 If (IntersectsAnyWall() == null) //no collision

这很好但是我没有滑动工作。通过滑动我的意思是当玩家以某个角度走进墙壁时,他沿着它滑动而不是停下来。将运动分成X和Z分量,然后分别测试它们会产生抖动效果,这不是我想要的。

任何人都可以给我一个关于如何通过OBB碰撞进行滑动的建议吗?

1 个答案:

答案 0 :(得分:0)

墙可以建模以仅停止墙壁法线方向的移动。为了允许滑动,您必须在碰撞位置找到墙壁的法线。此外,计算碰撞发生的深度是个好主意。然后你所要做的就是减去“不可通过的”部分:

Position = OldPosition + PositionChange
if(IntersectsAnyWall() != null)
{
    var normal = //wall's normal at collision site
    var collisionDepth = ...;
    Position += collisionDepth * normal;
}

如果无法计算碰撞深度,也可以沿法线减去整个零件:

Position = OldPosition + PositionChange
if(IntersectsAnyWall() != null)
{
    var normal = //wall's normal at collision site
    var partAlongNormal = Vector2.Dot(PositionChange, -normal);
    Position += partAlongNormal * normal;
}