2using System.Collections.Generic;
15 private readonly Mesh mesh;
16 private readonly
int[] meshTriangles;
17 private readonly Vector3[] meshVertices;
18 private readonly Vector2[] meshUV;
27 throw new ArgumentNullException(
"mesh");
29 meshTriangles = this.mesh.triangles;
30 meshVertices = this.mesh.vertices;
31 if (this.mesh.uv.Length == 0)
33 var vertices = mesh.vertices;
34 var uvs =
new Vector2[vertices.Length];
36 for (var i = 0; i < uvs.Length; i++) uvs[i] =
new Vector2(vertices[i].x, vertices[i].z);
41 meshUV = this.mesh.uv;
52 public bool LocalPointToUV(Vector3 localPoint, Matrix4x4 matrixMVP, out Vector2 uv)
62 for (var i = 0; i < meshTriangles.Length; i += 3)
68 t1 = meshVertices[meshTriangles[index0]];
69 t2 = meshVertices[meshTriangles[index1]];
70 t3 = meshVertices[meshTriangles[index2]];
72 if (!
Math.ExistPointInPlane(p, t1, t2, t3))
74 if (!
Math.ExistPointOnTriangleEdge(p, t1, t2, t3) && !
Math.ExistPointInTriangle(p, t1, t2, t3))
77 var uv1 = meshUV[meshTriangles[index0]];
78 var uv2 = meshUV[meshTriangles[index1]];
79 var uv3 = meshUV[meshTriangles[index2]];
80 uv =
Math.TextureCoordinateCalculation(p, t1, uv1, t2, uv2, t3, uv3, matrixMVP);
85 uv =
default(Vector3);
97 var tris =
Math.GetNearestVerticesTriangle(p, meshVertices, meshTriangles);
98 var pds =
new List<Vector3>();
99 for (var i = 0; i < tris.Length; i += 3)
104 pds.Add(
Math.TriangleSpaceProjection(p, tris[i0], tris[i1], tris[i2]));
107 return pds.OrderBy(t => Vector3.Distance(p, t)).First();
110 #endregion PublicMethod
A class that manipulates Mesh.
bool LocalPointToUV(Vector3 localPoint, Matrix4x4 matrixMVP, out Vector2 uv)
Convert local-space point to texture coordinates.
Vector3 NearestLocalSurfacePoint(Vector3 localPoint)
Returns the point on the surface of Mesh closest to the point on the specified local-space.