diff --git a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java index b1e6038..dcdd32a 100644 --- a/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java +++ b/src/main/java/org/ntlab/radishforandroidstudio/framework/physics/BoundingBoxVisitor.java @@ -9,9 +9,9 @@ public class BoundingBoxVisitor extends ObjectVisitor { - private ArrayList obbList = new ArrayList(); // 全構成要素のOBBのリスト - private ArrayList bsStack = new ArrayList(); // オブジェクトの階層毎のBoundingSphereのスタック - private String partName = null; // 部品を指定する場合に使う + private ArrayList obbList = new ArrayList(); // 蜈ィ讒区�占ヲ∫エ�縺ョOBB縺ョ繝ェ繧ケ繝� + private ArrayList bsStack = new ArrayList(); // 繧ェ繝悶ず繧ァ繧ッ繝医�ョ髫主ア、豈弱�ョBoundingSphere縺ョ繧ケ繧ソ繝�繧ッ + private String partName = null; // 驛ィ蜩√r謖�螳壹☆繧句�エ蜷医↓菴ソ縺� private boolean inPart = false; public BoundingBoxVisitor() { @@ -28,7 +28,7 @@ inPart = true; } if (obj.hasChildren() && obj.bs == null) { - // 子供がいる場合、下の階層用にnullをpushする + // 蟄蝉セ帙′縺�繧句�エ蜷医�∽ク九�ョ髫主ア、逕ィ縺ォnull繧恥ush縺吶k bsStack.add(null); } } @@ -36,7 +36,7 @@ public void postVisit(Object3D obj) { int pattern = 2; if (!obj.hasChildren()) { - // 葉の場合 + // 闡峨�ョ蝣エ蜷� OBB obb = obj.getOBB(pattern); if (obb != null) { if (obj.bs == null) { @@ -47,37 +47,41 @@ BoundingSphere bs = (BoundingSphere)obj.bs.clone(); for (int i = stackList.size() - 1; i >= 0; i--) { obb.transform(stackList.get(i)); - bs.transform(stackList.get(i)); + if (i >= stackList.size() - 4) bs.transform(stackList.get(i)); } if (partName == null || partName.length() == 0 || inPart) { - obbList.add(obb); // Transform3Dを適応させたBoundsをboundsListに追加 + obbList.add(obb); // Transform3D繧帝←蠢懊&縺帙◆Bounds繧鍛oundsList縺ォ霑ス蜉� int stackTop = bsStack.size() - 1; if (bs != null && stackTop >= 0) { if (bsStack.get(stackTop) == null) { - // その階層の最初のオブジェクトの場合、nullを置き換え + // 縺昴�ョ髫主ア、縺ョ譛�蛻昴�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�]ull繧堤スョ縺肴鋤縺� bsStack.set(stackTop, bs); } else { - // その階層の2番目以降のオブジェクトの場合、結合 + // 縺昴�ョ髫主ア、縺ョ2逡ェ逶ョ莉・髯阪�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�∫オ仙粋 bsStack.get(stackTop).combine(bs); } } } } } else { - // 子供がいる場合 + // 蟄蝉セ帙′縺�繧句�エ蜷� int stackTop = bsStack.size() - 1; if (obj.bs == null) { - // 下の階層の結合結果をpopして利用する + // 荳九�ョ髫主ア、縺ョ邨仙粋邨先棡繧恥op縺励※蛻ゥ逕ィ縺吶k obj.bs = bsStack.remove(stackTop); stackTop--; } if (obj.bs != null && stackTop >= 0) { + BoundingSphere bs = (BoundingSphere)obj.bs.clone(); + for (int i = stackList.size() - 1; i >= stackList.size() - 4; i--) { + bs.transform(stackList.get(i)); + } if (bsStack.get(stackTop) == null) { - // その階層の最初のオブジェクトの場合、nullを置き換え - bsStack.set(stackTop, obj.bs); + // 縺昴�ョ髫主ア、縺ョ譛�蛻昴�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�]ull繧堤スョ縺肴鋤縺� + bsStack.set(stackTop, bs); } else { - // その階層の2番目以降のオブジェクトの場合、結合 - bsStack.get(stackTop).combine(obj.bs); + // 縺昴�ョ髫主ア、縺ョ2逡ェ逶ョ莉・髯阪�ョ繧ェ繝悶ず繧ァ繧ッ繝医�ョ蝣エ蜷医�∫オ仙粋 + bsStack.get(stackTop).combine(bs); } } }