3 回答

TA貢獻1810條經驗 獲得超5個贊
實際上是一個非常簡單的計算。
訣竅是計算四面體的有符號體積 -根據您的三角形并以原點為起點。體積的符號來自于三角形是否指向原點方向。(三角形的法線本身取決于頂點的順序,這就是為什么您看不到下面明確引用的三角形的原因。)
這全部歸結為以下簡單功能:
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());
}

TA貢獻1848條經驗 獲得超6個贊
上面的方法適用于像球形四面體等“簡單”對象(沒有相交/重疊的三角形)。對于更復雜的形狀,一個好主意是分割網格(將其關閉)并分別計算每個分段的體積。希望這可以幫助。
添加回答
舉報