/// <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)); }
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); }
/// <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)); }