Beispiel #1
0
        public void RayIntersectsTriangle2()
        {
            //create a triangle
            Vector3 vert0 = new Vector3(0f, 0f, 0f);
            Vector3 vert1 = new Vector3(0.5f, 0f, 0.87f);
            Vector3 vert2 = new Vector3(1f, 0f, 0f);

            Vector3 origin    = new Vector3(0.5f, 0.5f, 0.43f);
            Vector3 direction = Vector3.down;

            //result
            Vector3 hitNormal = Vector3.zero;
            float   distance  = 0f;

            //should intersects
            bool intersects = PolyMath.RayIntersectsTriangle2(origin, direction, vert0, vert1, vert2, ref distance, ref hitNormal);

            Assert.IsTrue(intersects);
            Assert.IsTrue(distance == 0.5f);
            //the hitnormal is not normalized, I don't know why (????)
            Assert.IsTrue(hitNormal.normalized == Vector3.up);

            //should not intersects
            direction  = Vector3.up;
            intersects = PolyMath.RayIntersectsTriangle2(origin, direction, vert0, vert1, vert2, ref distance, ref hitNormal);
            Assert.IsFalse(intersects);

            //should not intersects
            origin     = new Vector3(5f, 0.5f, 0f);
            direction  = Vector3.down;
            intersects = PolyMath.RayIntersectsTriangle2(origin, direction, vert0, vert1, vert2, ref distance, ref hitNormal);
            Assert.IsFalse(intersects);
        }
        /// <summary>
        /// Cast a ray (in model space) against a mesh.
        /// </summary>
        /// <param name="InRay"></param>
        /// <param name="vertices"></param>
        /// <param name="triangles"></param>
        /// <param name="hit"></param>
        /// <param name="distance"></param>
        /// <param name="cullingMode"></param>
        /// <returns></returns>
        internal static bool MeshRaycast(Ray InRay, Vector3[] vertices, int[] triangles, out PolyRaycastHit hit, float distance = Mathf.Infinity, Culling cullingMode = Culling.Front)
        {
            float   hitDistance = Mathf.Infinity;
            Vector3 hitNormal = Vector3.zero;   // vars used in loop
            Vector3 vert0, vert1, vert2;
            int     hitFace = -1;
            Vector3 origin = InRay.origin, direction = InRay.direction;

            /**
             * Iterate faces, testing for nearest hit to ray origin.
             */
            for (int CurTri = 0; CurTri < triangles.Length; CurTri += 3)
            {
                if (CurTri + 2 >= triangles.Length)
                {
                    continue;
                }
                if (triangles[CurTri + 2] >= vertices.Length)
                {
                    continue;
                }

                vert0 = vertices[triangles[CurTri + 0]];
                vert1 = vertices[triangles[CurTri + 1]];
                vert2 = vertices[triangles[CurTri + 2]];

                if (PolyMath.RayIntersectsTriangle2(origin, direction, vert0, vert1, vert2, ref distance, ref hitNormal))
                {
                    hitFace     = CurTri / 3;
                    hitDistance = distance;
                    break;
                }
            }

            hit = new PolyRaycastHit(hitDistance,
                                     InRay.GetPoint(hitDistance),
                                     hitNormal,
                                     hitFace);

            return(hitFace > -1);
        }