计算3D网格的体积

我厌倦了计算3D物体的体积(Cube,Cylinder ……)可以任何一个帮助

有这个问题? 问题是,如何从他的身上计算物体的体积

基于三角形的坐标。 我的class级做得不好,任何人帮助我

强化class级?

谢谢

public class Algorithm { private Mesh _mesh { get; set; } public Algorithm(Mesh mesh) { _mesh = mesh; } private double SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 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.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123); } public double VolumeOfMesh() { double volume = 0.0; Vector3[] vertices = _mesh.Vertices; int[] triangles = _mesh.Triangles; for (int i = 0; i < _mesh.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); } return Math.Abs(volume); } } public class Mesh { public Mesh(Vector3[] _vertices,int[] _triangles) { Vertices = _vertices; Triangles = _triangles; } public Vector3[] Vertices { get; set; } public int[] Triangles { get; set; } } public class Vector3 { public Vector3() { } public Vector3(double x,double y,double z) { X = x; Y = y; Z = z; } public double X { get; set; } public double Y { get; set; } public double Z { get; set; } } private void button1_Click(object sender, EventArgs e) { Vector3[] vers = new Vector3[8] { new Vector3 {X = 5,Y = 5,Z =5}, new Vector3 {X = 15,Y = 5,Z =5}, new Vector3 {X = 15,Y = 15,Z =5}, new Vector3 {X = 5,Y = 15,Z =5}, new Vector3 {X = 5,Y = 5,Z =15}, new Vector3 {X = 15,Y = 5,Z =15}, new Vector3 {X = 15,Y = 15,Z =15}, new Vector3 {X = 5,Y = 15,Z =15}, }; int[] trs = new int[36] { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 1, 6, 2, 1, 5, 6, 0, 4, 7, 0, 7, 3, 0, 1, 5, 0, 5, 4, 3, 2, 6,3, 6, 7 }; Mesh mesh = new Mesh(vers, trs); Algorithm algo = new Algorithm(mesh); var vol = algo.VolumeOfMesh(); MessageBox.Show(vol.ToString()); } 

我的测试结果是vol = 666,666但它应该是1000。

这条线

double v132 = (p3.X - basePoint.X) * (p3.Y - basePoint.Y) * (p2.Z - basePoint.Z);

根据如何计算3D网格对象的体积是不正确的, 其表面由三角形组成 (应注意p1.X而不是p3.X):

var v132 = p1.X*p3.Y*p2.Z;

编辑

虽然您将此答案标记为正确,但我测试了代码并发现了更多错误。

通过调整三角形索引,三角形并非都朝外(或向内):

 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6,// adjusted 1, 6, 2, 1, 5, 6, 0, 7, 4,// adjusted 0, 3, 7,// adjusted 0, 5, 1,// adjusted 0, 4, 5,// adjusted 3, 2, 6, 3, 6, 7 

所有法线都朝外。 然后计算返回-1000负值,具体取决于基本偏移量。