2
我想開發一個簡單的3d環境(在openTK中,所以基本上openGL),並實現簡單的碰撞檢測。我將有相機對象,它將有一個邊界立方體和一個充滿三角形和四邊形的世界。C#簡單的3D碰撞檢測
如果我給出了一個邊界立方體(或邊界球如果更容易)和多邊形列表,是否有一種快速和骯髒的方法來做基本的碰撞檢測?
感謝所有幫助
我想開發一個簡單的3d環境(在openTK中,所以基本上openGL),並實現簡單的碰撞檢測。我將有相機對象,它將有一個邊界立方體和一個充滿三角形和四邊形的世界。C#簡單的3D碰撞檢測
如果我給出了一個邊界立方體(或邊界球如果更容易)和多邊形列表,是否有一種快速和骯髒的方法來做基本的碰撞檢測?
感謝所有幫助
好吧,簡單的包圍盒碰撞,我寫了下面的方法,將接受一個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;
}
你做喜歡的事調用它。
希望這對其他人有用!