c#简单的3D碰撞检测

本文关键字:碰撞检测 3D 简单 | 更新日期: 2023-09-27 17:48:58

我正在尝试开发一个简单的3d环境(在openTK中,所以基本上是openGL)并实现简单的碰撞检测。我将有一个camera对象,它将有一个边界立方体和一个充满三角形和四边形的世界。

如果我有一个边界立方体(或边界球体,如果这更容易)和一个多边形列表,是否有一个快速和肮脏的方法来做基本的碰撞检测?

感谢您的帮助

c#简单的3D碰撞检测

对于简单的边界框碰撞,我编写了以下方法,该方法将接受BoundingBox对象并确定它是否在BoundingBox的当前实例中。

边界框由A Point3D对象(与Point类相同,但具有Z坐标)作为边界框的中心,以及框的高度、宽度和深度组成。对于这4个对象,它计算盒子的左(最小X)、右(最大X)、下(最小Y)、上(最大Y)、前(最小Z)和后(最大Z)(盒子与轴对齐)。这是简单的碰撞)。下面是检测一个框是否在另一个框内的方法,如果是,修改框将其移到外面。

    public void Intersection(ref BoundingBox box)
    {
        double lr = Left - box.Right;
        double rl = box.Left - Right;
        double bt = Bottom - box.Top;
        double tb = box.Bottom - Top;
        double fb = Front - box.Back;
        double bf = box.Front - Back;
        if (lr > 0 || rl > 0 || bt > 0 || tb > 0 || bf > 0 || fb > 0)
            return;
        double max = Math.Max(lr, Math.Max(rl, Math.Max(bt, Math.Max(tb, Math.Max(bf, fb)))));
        if (_complex)
        {
            if (ComplexIntersection(ref box))
                return;
        }
        if (max == lr)
            box.Center.X += max;
        else if (max == rl)
            box.Center.X -= max;
        else if (max == bt)
            box.Center.Y += max;
        else if (max == tb)
            box.Center.Y -= max;
        else if (max == fb)
            box.Center.Z += max;
        else if (max == bf)
            box.Center.Z -= max;
    }

你可以这样调用它:meshData.Box.Intersection(ref camera.box);,其中meshData是场景中的某种几何形状,camera是当前用户视角的对象。

希望这对其他人有用!