Exemplo n.º 1
0
        /// <summary>
        /// Finds closest triangle to ray start given array of meshes.
        /// </summary>
        /// <param name="meshes">The meshes.</param>
        /// <param name="parent">Parent game object that transforms the mesh.</param>
        /// <param name="worldRay">Ray in world coordinate frame.</param>
        /// <param name="rayLength">Length of the ray.</param>
        /// <returns>Data with result, result.Valid == true if the ray intersects a triangle.</returns>
        public static Raycast.TriangleHit FindClosestTriangle(Mesh[] meshes, GameObject parent, Ray worldRay, float rayLength = 500.0f)
        {
            if (meshes.Length == 0)
            {
                return(Raycast.TriangleHit.Invalid);
            }

            Raycast.TriangleHit[] results = new Raycast.TriangleHit[meshes.Length];
            for (int i = 0; i < meshes.Length; ++i)
            {
                results[i] = FindClosestTriangle(meshes[i], parent, worldRay, rayLength);
            }

            return(FindBestResult(results));
        }
Exemplo n.º 2
0
        public static Raycast.TriangleHit FindBestResult(Raycast.TriangleHit[] results)
        {
            if (results.Length == 0)
            {
                return(Raycast.TriangleHit.Invalid);
            }

            Raycast.TriangleHit best = results[0];
            for (int i = 1; i < results.Length; ++i)
            {
                if (results[i].Distance < best.Distance)
                {
                    best = results[i];
                }
            }

            return(best);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Finds closest triangle to ray start in game object with one or many MeshFilters.
        /// </summary>
        /// <param name="parentGameObject">Object with render data (MeshFilters).</param>
        /// <param name="worldRay">Ray given in world coordinate system.</param>
        /// <param name="rayLength">Length of the ray.</param>
        /// <returns>Data with result, result.Valid == true if the ray intersects a triangle.</returns>
        public static Raycast.TriangleHit FindClosestTriangle(GameObject parentGameObject, UnityEngine.Ray worldRay, float rayLength = 500.0f)
        {
            if (parentGameObject == null)
            {
                return(Raycast.TriangleHit.Invalid);
            }

            MeshFilter[] meshFilters = parentGameObject.GetComponentsInChildren <UnityEngine.MeshFilter>();
            if (meshFilters.Length == 0)
            {
                return(Raycast.TriangleHit.Invalid);
            }

            Raycast.TriangleHit[] results = new Raycast.TriangleHit[meshFilters.Length];
            for (int i = 0; i < meshFilters.Length; ++i)
            {
                results[i] = FindClosestTriangle(meshFilters[i].sharedMesh, meshFilters[i].gameObject, worldRay, rayLength);
            }

            return(FindBestResult(results));
        }