在我的libgdx遊戲中,我對地圖和玩家對象有3D BoundingBoxes和Spheres。我想計算它們是否相互碰撞以便正確地模擬這些物體的運動。我可以使用什麼方法來計算這些對象是否相互碰撞/相交?libgdx中BoundingBox和Sphere之間的碰撞檢測
2
A
回答
3
您可以使用下面的方法:
public static boolean intersectsWith(BoundingBox boundingBox, Sphere sphere) {
float dmin = 0;
Vector3 center = sphere.center;
Vector3 bmin = boundingBox.getMin();
Vector3 bmax = boundingBox.getMax();
if (center.x < bmin.x) {
dmin += Math.pow(center.x - bmin.x, 2);
} else if (center.x > bmax.x) {
dmin += Math.pow(center.x - bmax.x, 2);
}
if (center.y < bmin.y) {
dmin += Math.pow(center.y - bmin.y, 2);
} else if (center.y > bmax.y) {
dmin += Math.pow(center.y - bmax.y, 2);
}
if (center.z < bmin.z) {
dmin += Math.pow(center.z - bmin.z, 2);
} else if (center.z > bmax.z) {
dmin += Math.pow(center.z - bmax.z, 2);
}
return dmin <= Math.pow(sphere.radius, 2);
}
它之後
由吉姆·帕特 從「圖形寶石」,科學出版社爲箱型球相交測試 的簡單方法建模, 1990
可在此處找到示例C代碼:http://www.realtimerendering.com/resources/GraphicsGems/gems/BoxSphere.c
1
以上答案僅適用於AABB(軸對齊邊界框)。該方法雖然簡潔美觀。所以我把它擴大到包括一般的包圍盒。波紋管是提供與上述相同算法的最小代碼。在下面的代碼中,邊界框由中心和3個方向矢量R,S和T指定。每個代表框的主邊的方向和長度。
struct OBBox{
vector3 center;
vector3 S; // representing side s.
vector3 R;
vector3 T;
/* s, r, and t take -1 or +1 representing a corner along side S, R, and T correspondingly. If one of s, r, or t is 0 then middle of corresponding edge of the non-zero side is returned. If 2 of them are 0, then middle of the plane of the corresponding side is returned. */
vector3 getCorner(int s, int r, int t)
{
return center + (s*S + r*R + t*T)/2.0;
}
}
public static boolean intersectsWith(OBBox bbox, Sphere sphere){
float dmin = 0.;
vector3 center = sphere.center;
float centerS = center.S;
float centerR = center.R;
float centerT = center.T;
vector3 bminS = bbox.getCorner(-1, 0, 0);
vector3 bmaxS = bbox.getCorner(1, 0, 0);
vector3 bminR = bbox.getCorner(0, -1, 0);
vector3 bmaxR = bbox.getCorner(0, 1, 0);
vector3 bminT = bbox.getCorner(0, 0, -1);
vector3 bmaxT = bbox.getCorner(0, 0, 1);
if(centerS < bminS.S) {
dmin += (centerS-bminS).(centerS-minS); // . means 3d dot product.
else if(centerS > bmaxS)
dmin += (centerS-bmaxS).(centerS-bmaxS);
}
if(centerR < bminR.R) {
dmin += (centerR-bminR).(centerR-minR);
else if(centerR > bmaxR.R)
dmin += (centerR-bmaxR).(centerR-bmaxR);
}
if(centerT < bminT.T) {
dmin += (centerT-bminT).(centerT-minT);
else if(centerT > bmaxT)
dmin += (centerT-bmaxT).(centerT-bmaxT);
}
return dmin <= (sphere.radius).(sphere.radius);
}
相關問題
- 1. 矩形之間的碰撞檢測libgdx
- 2. OpenGL BoundingBox碰撞檢測
- 3. 碰撞檢測,在libgdx
- 4. 碰撞檢測Libgdx矩形
- 5. LibGDX 3D碰撞檢測
- 6. 的Android Libgdx和碰撞檢測
- 7. Unity Sphere碰撞
- 8. libgdx中兩個BoundingBoxes之間的碰撞檢測
- 9. 如何檢測libgdx中兩個精靈之間的碰撞?
- 10. LibGdx輸入處理和碰撞檢測
- 11. LibGDX - 2d中的矩形碰撞檢測?
- 12. n體碰撞檢測和成對碰撞檢測之間的區別?
- 13. 我如何檢測2個矩形之間的碰撞? LIBGDX
- 14. libgdx中Circle-Rectangle碰撞端檢測
- 15. cocos2d的使用boundingBox的檢查碰撞
- 16. KineticJS - 形狀之間的碰撞檢測
- 17. 球之間的碰撞檢測javascript
- 18. Divs之間的碰撞檢測
- 19. 檢測精靈之間的碰撞
- 20. 檢測透明UIImageviews之間的碰撞
- 21. UIImageViews之間的碰撞檢測
- 22. Libgdx近戰攻擊碰撞檢測
- 23. Libgdx旋轉橢圓碰撞檢測
- 24. LibGdx - 平鋪遊戲碰撞檢測
- 25. libGdx碰撞檢測多邊形
- 26. 運動物體碰撞檢測LIBGDX
- 27. 碰撞檢測和碰撞響應
- 28. Pygame中的圖像和物體之間的碰撞檢測
- 29. 碰撞檢測
- 30. 碰撞檢測
您提供的鏈接已死亡;這就是爲什麼我們不鏈接到外部網站。 – Krythic 2015-11-24 23:50:33
@Krythic固定。這就是爲什麼我們使用Google ...;) – nerdinand 2015-11-25 12:34:39