2011-04-05 118 views
2

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

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

感谢所有帮助

回答

4

好吧,简单的包围盒碰撞,我写了下面的方法,将接受一个BoundingBox对象,并确定它是否是一个BoundingBox的当前实例中。

边界框由边界框中心的一个Point3D对象(与Point类相同但带有Z坐标)以及该框的高度,宽度和深度组成。使用这4个对象,它计算框的左(最小X),右(最大X),底部(最小Y),最大(最大Y),最前(最小Z)和最后(最大Z)轴对齐,这是简单的碰撞)。这里是检测一个盒子是否在另一个盒子内的方法,如果是的话,修改盒子将其移到外面。 meshData.Box.Intersection(ref camera.box);其中meshData是在场景某种几何形状和camera是当前用户的角度来看,对象:

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

你做喜欢的事调用它。

希望这对其他人有用!