C#简单3D碰撞检测
我正在尝试开发一个简单的3D环境(在openTK中,基本上是openGL)并实现简单的碰撞检测。 我将拥有一个相机对象,它将有一个边界立方体和一个充满三角形和四边形的世界。
如果我给了一个边界立方体(或者如果更容易的边界球)和一个多边形列表,是否有一种快速而肮脏的方法来进行基本的碰撞检测?
谢谢你的帮助
好的,对于简单的边界框冲突,我编写了以下方法,它将接受BoundingBox
对象并确定它是否在BoundingBox
的当前实例内。
边界框由边界框中心的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
是当前用户视角的对象。
希望这对其他人有用!