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

你做喜歡的事調用它。

希望這對其他人有用!