2

我一直在开发一个基本的 3D XNA 游戏。到目前为止,我已经设法将各种角色模型加载到更大的关卡/世界模型上。我加入了一些基本控件,允许用户/玩家在世界各地移动其中一个角色——甚至使用 BoundingSphere/BoundingBox 和其他角色模型实现了一些碰撞检测。

然而,角色模型(目前)被卡在 Y 轴上的固定位置,所以我的世界实际上只是一个平面供他们滑过。

我现在要做的是实现一种类似重力的力,它可以让角色随着地形的流动而上升和下降。我花了几个小时在谷歌搜索(徒劳无功)以某种方式检查我的角色的边界范围与世界的实际网格之间的详细碰撞。我发现的文章似乎都在解释如何使用 sphere 和 box 方法,或者实现一些外部物理引擎(对于我想要实现的目标,所有这些似乎都非常精细)。

所以我的问题是双重的 -

  • 首先,我是否以最好的方式处理这个问题?我的世界只有一个大型模型?
  • 其次,是否有一种相对简单的方法来检查我需要的碰撞类型,使用 XNA 库本身,或者不需要我引入全新物理层的其他库。

注意。我要检查冲突的模型是:Microsoft.Xna.Framework.Graphics.Model

编辑:

我还应该提到,我不是在创建一个单一的关卡,而是一个游戏引擎,它可以与从数据库加载的各种关卡一起工作。出于这个原因,我不想单独/手动定义关卡的约束。理想情况下,我希望从数据库中加载我的单个网格并能够按原样检测与它的碰撞,或者自动从网格数据中计算出约束/边界区域。

4

4 回答 4

0

第一个答案为您提供了详细碰撞检测的首次通过测试。您可以改进第一次通过并使用 AABB 测试。然后第二遍需要进行射线-三角形相交测试。请小心,因为当光线击中三角形边缘或顶点时,其中一些会失败 - 因此请确保您选择的测试器代码/算法考虑了这些。使用四叉树或其他空间划分方案进行了进一步的修改,以提高碰撞检测的速度。

于 2013-02-11T22:59:14.720 回答
0

3d 碰撞检测比乍看之下要复杂得多,因此请使用规定的方法之一(即 BoundingSphere 对象可以提供帮助)。检查http://msdn.microsoft.com/en-us/library/bb203906(v=xnagamestudio.10).aspx

具体来说,这个代码块给出了一个想法:

static void CheckForCollisions( ref WorldObject c1, ref WorldObject c2 )
{
    for (int i = 0; i < c1.model.Meshes.Count; i++)
    {
        // Check whether the bounding boxes of the two cubes intersect.
        BoundingSphere c1BoundingSphere = c1.model.Meshes[i].BoundingSphere;
        c1BoundingSphere.Center += c1.position;

        for (int j = 0; j < c2.model.Meshes.Count; j++)
        {
            BoundingSphere c2BoundingSphere = c2.model.Meshes[j].BoundingSphere;
            c2BoundingSphere.Center += c2.position;

            if (c1BoundingSphere.Intersects( c2BoundingSphere ))
            {
                c2.ReverseVelocity();
                c1.Backup();
                c1.ReverseVelocity();
                return;
            }
        }
    }
}
于 2012-10-08T23:01:36.197 回答
-1

你可以伪造它。换句话说,我假设,在每次更新调用中,您可以将玩家的高度设置为玩家碰巧所在的地形高度。我想这不是最专业的处理方式,但可能会奏效。

于 2014-07-28T19:06:58.550 回答
-1

以下是我曾经适用于 2D 碰撞检测的球体/三角形技术的详细描述:

http://www.peroxide.dk/papers/collision/collision.pdf

我不能肯定地说它会对你有所帮助,但它可能对与地形网格和重力的碰撞很有用。将其与与其他“角色”的碰撞结合起来可能具有挑战性,具体取决于您想要做什么。但是,它确实具体描述了如何实现重力,总体而言,它是您在 3D 中可能采用的碰撞检测和角色物理的更简单方法之一。

至于与整个地形网格碰撞是否是“正确”的方法的问题......如果它是一个简单的网格并且您不受资源限制,那么可以确定。但是,碰撞检测的计算成本很高,并且将其应用于网格中的所有三角形可能很快变得不可能。通常,您可能希望将三角形存储在一些有效的可搜索结构中,例如八叉树kd 树,然后粗略搜索您角色附近的三角形,然后可以在更短的时间内更精确地测试碰撞测试网格中的每个三角形。

于 2013-02-11T23:14:13.827 回答