使用OBB滑动碰撞

本文关键字:碰撞 OBB 使用 | 更新日期: 2023-09-27 18:10:44

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

这工作得很好,但我没有滑动工作。我所说的滑动是指当玩家以一定角度走进墙壁时,他会沿着墙壁滑动而不是停下来。将移动拆分为X和Z组件,然后分别测试它们会产生抖动效果,这不是我想要的。

谁能给我一个建议,如何处理滑动与OBB碰撞?

使用OBB滑动碰撞

可以对墙体进行建模,只停止在墙体法线方向上的运动。为了允许滑动,你必须在碰撞点找到墙的法线。此外,计算碰撞发生的深度是个好主意。然后你所要做的就是减去"不可通过"的部分:

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;
}