2using System.Collections.Generic;
7 public static class Math
9 private const float TOLERANCE = 1E-2f;
20 public static bool ExistPointInPlane(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
27 var val =
Vector3.Dot(nv.normalized, vp.normalized);
28 if (-TOLERANCE < val && val < TOLERANCE)
40 public static bool ExistPointOnEdge(Vector3 p, Vector3 v1, Vector3 v2)
42 return 1 - TOLERANCE <
Vector3.Dot((v2 - p).normalized, (v2 - v1).normalized);
53 public static bool ExistPointOnTriangleEdge(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
55 if (ExistPointOnEdge(p, t1, t2) || ExistPointOnEdge(p, t2, t3) || ExistPointOnEdge(p, t3, t1))
69 public static bool ExistPointInTriangle(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
71 var a =
Vector3.Cross(t1 - t3, p - t1).normalized;
72 var b =
Vector3.Cross(t2 - t1, p - t2).normalized;
73 var c =
Vector3.Cross(t3 - t2, p - t3).normalized;
78 if (1 - TOLERANCE < d_ab && 1 - TOLERANCE < d_bc)
96 public static Vector2 TextureCoordinateCalculation(Vector3 p, Vector3 t1, Vector2 t1UV, Vector3 t2,
97 Vector2 t2UV, Vector3 t3, Vector2 t3UV, Matrix4x4 transformMatrix)
99 var p1_p = transformMatrix *
new Vector4(t1.x, t1.y, t1.z, 1);
100 var p2_p = transformMatrix *
new Vector4(t2.x, t2.y, t2.z, 1);
101 var p3_p = transformMatrix *
new Vector4(t3.x, t3.y, t3.z, 1);
102 var p_p = transformMatrix *
new Vector4(p.x, p.y, p.z, 1);
103 var p1_n =
new Vector2(p1_p.x, p1_p.y) / p1_p.w;
104 var p2_n =
new Vector2(p2_p.x, p2_p.y) / p2_p.w;
105 var p3_n =
new Vector2(p3_p.x, p3_p.y) / p3_p.w;
106 var p_n =
new Vector2(p_p.x, p_p.y) / p_p.w;
107 var s = 0.5f * ((p2_n.x - p1_n.x) * (p3_n.y - p1_n.y) - (p2_n.y - p1_n.y) * (p3_n.x - p1_n.x));
108 var s1 = 0.5f * ((p3_n.x - p_n.x) * (p1_n.y - p_n.y) - (p3_n.y - p_n.y) * (p1_n.x - p_n.x));
109 var s2 = 0.5f * ((p1_n.x - p_n.x) * (p2_n.y - p_n.y) - (p1_n.y - p_n.y) * (p2_n.x - p_n.x));
112 var w = 1 / ((1 - u - v) * 1 / p1_p.w + u * 1 / p2_p.w + v * 1 / p3_p.w);
113 return w * ((1 - u - v) * t1UV / p1_p.w + u * t2UV / p2_p.w + v * t3UV / p3_p.w);
124 public static Vector3[] GetNearestVerticesTriangle(Vector3 p, Vector3[] vertices,
int[] triangles)
126 var ret =
new List<Vector3>();
128 var nearestIndex = triangles[0];
129 var nearestDistance =
Vector3.Distance(vertices[nearestIndex], p);
131 for (var i = 0; i < vertices.Length; ++i)
133 var distance =
Vector3.Distance(vertices[i], p);
134 if (distance < nearestDistance)
136 nearestDistance = distance;
141 for (var i = 0; i < triangles.Length; ++i)
142 if (triangles[i] == nearestIndex)
145 int i0 = i, i1 = 0, i2 = 0;
167 ret.Add(vertices[triangles[i0]]);
168 ret.Add(vertices[triangles[i1]]);
169 ret.Add(vertices[triangles[i2]]);
172 return ret.ToArray();
183 public static Vector3 TriangleSpaceProjection(Vector3 p, Vector3 t1, Vector3 t2, Vector3 t3)
185 var g = (t1 + t2 + t3) / 3;
193 var _pa_ = pa.magnitude;
194 var _pb_ = pb.magnitude;
195 var _pc_ = pc.magnitude;
197 var lmin = Mathf.Min(Mathf.Min(_pa_, _pb_), _pc_);
199 Func<float, float, float> k = (t, u) => (t - lmin + u - lmin) / 2;
201 var
A = k(_pb_, _pc_);
202 var
B = k(_pc_, _pa_);
203 var C = k(_pa_, _pb_);
204 var pd = g + (ga *
A + gb *
B + gc * C);