Mesh Statistics
GetAverageTriArea
GetAverageTriAreapublic float GetAverageTriArea(bool useColliderMesh)
{
Mesh m = useColliderMesh ? ColliderMesh : VisualMesh;
if (m == null) return 0f;
int[] tris = m.triangles;
Vector3[] v = m.vertices;
double areaSum = 0d; int triCount = 0;
for (int i = 0; i < tris.Length; i += 3)
{
if (i + 2 >= tris.Length) break;
Vector3 a = v[tris[i]], b = v[tris[i + 1]], c = v[tris[i + 2]];
areaSum += Vector3.Cross(b - a, c - a).magnitude * 0.5;
triCount++;
}
return triCount == 0 ? 0f : (float)(areaSum / triCount) * 10000f; // m² → cm²
}Purpose: Compute the average triangle area for visual or collider mesh.
Parameters: useColliderMesh — true = collider; false = visual.
Returns: Average area in cm² (0 if mesh is null).
Notes: Useful with SetAdaptiveSubdivisions to hit a target density.
GetDegenerateTriRatio
GetDegenerateTriRatiopublic float GetDegenerateTriRatio(bool useColliderMesh)
{
Mesh m = useColliderMesh ? ColliderMesh : VisualMesh;
if (m == null) return 0f;
int[] tris = m.triangles; Vector3[] v = m.vertices;
int degenerate = 0, total = tris.Length / 3;
for (int i = 0; i < tris.Length; i += 3)
{
if (i + 2 >= tris.Length) break;
Vector3 a = v[tris[i]], b = v[tris[i + 1]], c = v[tris[i + 2]];
if (Vector3.Cross(b - a, c - a).sqrMagnitude < kEpsilon) degenerate++;
}
return total == 0 ? 0f : (float)degenerate / total;
}Purpose: Ratio of degenerate (zero-area) triangles on a mesh.
Parameters: useColliderMesh — choose mesh to inspect.
Returns: Ratio in [0,1] (0 if mesh is null).
Notes: High values indicate over-subdivision or problematic trimming.
Last updated