To me, it sounds like there is a bit of explanation needed about how and why this formula works since we do have some assumptions. Basically, it is using the vectorial equation for the computation of the volume of a tetrahedron, explained and illustrated here:
This assumes that the vectors a, b and c define the edges of the tetrahedron and not the point coordinates of its vertices.
*Note: If you assume that the 4th point of the tetrahedron is on the origin, then you can use a, b and c as the coordinates of the vertices. Otherwise, if you have 4 vertices coordinates (let’s call them d,e,f,g), you can use the same equation but you should use: a = e-d; b = f-d; c=g-d. *
Also, please be aware that this equation works only with convex volume. You should envision to use the volume computation through voxelization (explained here: Triangle mesh voxelization - Wolfire Games Blog) if you want something more robust to complex shapes (but be aware that it is much slower to compute). However, I did not found an easy to use implementation, all those I found were giving compile errors in complex codes and I did not have time to figure it out.
Note2: @HoverX : Using Unity’s RigidBody SetDensity method computes, to my understanding the volume of the Collider’s box of your mesh (generally a Capsule). So it is a very coarse approximation.
So, implementing the same volume computation using the 4 vertices of the tetrahedron and defining the fourth vertex of every tetrahedron as the center of mass of the later, one gets the following implementation:
using UnityEngine;
public float SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 o)
{
Vector3 v1 = p1 - o;
Vector3 v2 = p2 - o;
Vector3 v3 = p3 - o;
return Vector3.Dot(Vector3.Cross(v1, v2), v3) / 6f; ;
}
public float VolumeOfMesh(Mesh mesh)
{
float volume = 0;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
Vector3 o = new Vector3(0f, 0f, 0f);
// Computing the center mass of the polyhedron as the fourth element of each mesh
for (int i = 0; i < triangles.Length; i++)
{
o += vertices[triangles*];*
}
o = o / mesh.triangles.Length;
// Computing the sum of the volumes of all the sub-polyhedrons
for (int i = 0; i < triangles.Length; i += 3)
{
Vector3 p1 = vertices[triangles[i + 0]];
Vector3 p2 = vertices[triangles[i + 1]];
Vector3 p3 = vertices[triangles[i + 2]];
volume += SignedVolumeOfTriangle(p1, p2, p3, o);
}
return Mathf.Abs(volume);
}