Читая эту статью , на самом деле это довольно простой расчет.
Хитрость заключается в том, чтобы вычислить подписанный объем тетраэдра - на основе вашего треугольника и завершенного в начале координат Знак объема зависит от того, указывает ли ваш треугольник в направлении начала координат. (Нормаль треугольника сама по себе зависит от порядка ваших вершин, поэтому вы не видите на него явную ссылку ниже.)
Все это сводится к следующей простой функции:
public float SignedVolumeOfTriangle(Vector p1, Vector p2, Vector p3) {
var v321 = p3.X*p2.Y*p1.Z;
var v231 = p2.X*p3.Y*p1.Z;
var v312 = p3.X*p1.Y*p2.Z;
var v132 = p1.X*p3.Y*p2.Z;
var v213 = p2.X*p1.Y*p3.Z;
var v123 = p1.X*p2.Y*p3.Z;
return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123);
}
, а затем драйвер для расчета объема сетки:
public float VolumeOfMesh(Mesh mesh) {
var vols = from t in mesh.Triangles
select SignedVolumeOfTriangle(t.P1, t.P2, t.P3);
return Math.Abs(vols.Sum());
}