Mesh Statistics

GetAverageTriArea

public 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: useColliderMeshtrue = collider; false = visual. Returns: Average area in cm² (0 if mesh is null). Notes: Useful with SetAdaptiveSubdivisions to hit a target density.


GetDegenerateTriRatio

public 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