public static int FindClosestFaceOnMesh(Quad[] meshFaces, Vector3[] meshVertexPositions, Vector3 targetPoint) { int bestFaceIdx = -1; float bestFaceDist = float.PositiveInfinity; for (int faceIdx = 0; faceIdx < meshFaces.Length; ++faceIdx) { Quad quad = meshFaces[faceIdx]; for (int i = 0; i < 2; ++i) { int vertexIdxA = quad.GetCorner(i + 0); int vertexIdxB = quad.GetCorner(i + 1); int vertexIdxC = quad.GetCorner(i + 2); PointOnMesh closestOnFace = PointOnMesh.MakeClosestToFace(meshVertexPositions, vertexIdxA, vertexIdxB, vertexIdxC, targetPoint); Vector3 closestOnFacePosition = closestOnFace.AsPosition(meshVertexPositions); float dist = Vector3.DistanceSquared(targetPoint, closestOnFacePosition); if (dist < bestFaceDist) { bestFaceIdx = faceIdx; bestFaceDist = dist; } } } return(bestFaceIdx); }
public static PointOnMesh FindClosestPointOnMesh(Quad[] meshFaces, Vector3[] meshVertexPositions, Vector3 targetPoint) { PointOnMesh bestPointOnMesh = default(PointOnMesh); float bestPointOnMeshDist = float.PositiveInfinity; foreach (Quad quad in meshFaces) { for (int i = 0; i < 2; ++i) { int vertexIdxA = quad.GetCorner(i + 0); int vertexIdxB = quad.GetCorner(i + 1); int vertexIdxC = quad.GetCorner(i + 2); PointOnMesh closestOnFace = PointOnMesh.MakeClosestToFace(meshVertexPositions, vertexIdxA, vertexIdxB, vertexIdxC, targetPoint); Vector3 closestOnFacePosition = closestOnFace.AsPosition(meshVertexPositions); float dist = Vector3.DistanceSquared(targetPoint, closestOnFacePosition); if (dist < bestPointOnMeshDist) { bestPointOnMesh = closestOnFace; bestPointOnMeshDist = dist; } } } return(bestPointOnMesh); }