public override void IntersectBF(BoundingSphere ball, List <DirectDetectData> res) { Queue <AABBTreeNode> q = new Queue <AABBTreeNode>(); q.Enqueue(this); while (q.Count > 0) { AABBTreeNode node = q.Dequeue(); if (MathEx.AABBIntersects(ref node.aabb, ref ball))//(node.aAABB.Intersect(ref ball.Center, ref ball.Radius)) { if (node.children != null) { for (int i = 0; i < node.children.Length; i++) { q.Enqueue((AABBTreeNode)node.children[i]); } } else { DirectDetectData data; Triangle face = (Triangle)node.faceData; if (MathEx.BoundingSphereIntersects(ref ball, ref face, out data.Position, out data.Normal, out data.Depth))//(ball.Intersect(ref face, out data.vPos, out data.vNormal, out data.dDepth)) { res.Add(data); } } } } q.Clear(); }
public override void IntersectDF(ref Triangle t, List <DirectDetectData> res) { if (MathEx.BoundingSphereIntersects(ref ball, ref t))// bBall.Intersect(ref t)) { if (children != null) { for (int i = 0; i < children.Length; i++) { children[i].IntersectDF(ref t, res); } } else { List <DirectDetectData> data; Triangle face = (Triangle)faceData; if (Triangle.TriangleIntersect(ref t, ref face, out data)) { for (int j = 0; j < data.Count; j++) { res.Add(data[j]); } } } } }
public override bool IntersectsSelectionRay(ref Ray ray) { bool d = Vector3.DistanceSquared(ref ray.Position, ref stdPosition) < 6000 * 6000; if (d) { return(MathEx.BoundingSphereIntersects(ref selectionSphere, ref ray)); } return(false); }
public override void IntersectDF(BBTreeNode cdTree, List <DirectDetectData> res) { //if (aAABB.Intersect(cdTree.bBall.vCentre, cdTree.bBall.dRange)) if (children != null) { for (int i = 0; i < children.Length; i++) { AABBTreeNode ch = (AABBTreeNode)children[i]; if (MathEx.BoundingSphereIntersects(ref cdTree.ball, ref ch.aabb)) //(cdTree.bBall.Intersect(ref ch.aAABB)) { cdTree.IntersectDF(ch, res); //相互遍历 } } } else { Triangle t = (Triangle)faceData; cdTree.IntersectDF(ref t, res); } }
public override void SearchDF(ref BoundingSphere ball, List <Triangle> res) { if (MathEx.BoundingSphereIntersects(ref ball, ref aabb))// ball.Intersect(ref aAABB)) { if (children != null) { for (int i = 0; i < children.Length; i++) { children[i].SearchDF(ref ball, res); } } else { Triangle t = (Triangle)faceData; if (MathEx.BoundingSphereIntersects(ref ball, ref t)) { res.Add(t); } //if (ball.Intersect(ref t)) res.Add(t); } } }
public override void IntersectDF(ref BoundingSphere ball, List <DirectDetectData> res) { if (MathEx.BoundingSphereIntersects(ref ball, ref ball))// bBall.Intersect(ref ball.Center, ref ball.Radius)) { if (children != null) { for (int i = 0; i < children.Length; i++) { children[i].IntersectDF(ref ball, res); } } else { DirectDetectData data; Triangle face = (Triangle)faceData; if (MathEx.BoundingSphereIntersects(ref ball, ref face, out data.Position, out data.Normal, out data.Depth))//)ball.Intersect(ref face, out data.vPos, out data.vNormal, out data.dDepth)) { res.Add(data); } } } }
public override void IntersectDF(ref LineSegment ra, List <DirectDetectData> res) { if (MathEx.BoundingSphereIntersects(ref ball, ref ra.Start, ref ra.End))// bBall.Intersect(ra.vStart, ra.vEnd)) { if (children != null) { for (int i = 0; i < children.Length; i++) { children[i].IntersectDF(ref ra, res); } } else { Vector3 pos; Triangle face = (Triangle)faceData; if (face.RayTriCollision(out pos, ref ra.Start, ref ra.End)) { res.Add(new DirectDetectData(pos, face.vN, 0)); } } } }