【问题标题】:XNA 3D Collision Detection for TerrainXNA 3D 地形碰撞检测
【发布时间】:2012-10-07 21:59:50
【问题描述】:

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

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

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

所以我的问题是双重的-

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

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

编辑:

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

【问题讨论】:

    标签: xna collision-detection terrain


    【解决方案1】:

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

    【讨论】:

    • 我已经研究过 BoundingSphere/BoundingBox 但他们无法达到我的需要
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-08-31
          • 1970-01-01
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          • 2013-08-10
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          相关资源
          最近更新 更多