Пример #1
0
        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();
        }
Пример #2
0
 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]);
                 }
             }
         }
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
 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);
     }
 }
Пример #5
0
 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);
         }
     }
 }
Пример #6
0
 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);
             }
         }
     }
 }
Пример #7
0
 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));
             }
         }
     }
 }