首页 文章

使用OBB进行碰撞滑动

提问于
浏览
0

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

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

谁能给我一个关于如何通过OBB碰撞进行滑动的建议?

1 回答

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

相关问题