模型格式:.obj
环境:python3.6+vtk7.1
vtk版:
1 import vtk 2 3 filename = "XXXX.obj" 4 reader = vtk.vtkOBJReader() 5 reader.SetFileName(filename) 6 reader.Update() 7 triangleFilter = vtk.vtkTriangleFilter() 8 triangleFilter.SetInputData(reader.GetOutput()) 9 triangleFilter.Update() 10 11 polygonProperties = vtk.vtkMassProperties() 12 polygonProperties.SetInputData(triangleFilter.GetOutput()) 13 polygonProperties.Update() 14 15 area = polygonProperties.GetSurfaceArea() 16 print(area)
自己写的版本:
先将文件数据读入数组face,和vertices
1 #计算3d 面片面积 2 def getarea(a, b, c): 3 ab = np.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2) 4 ac = np.sqrt((a[0] - c[0]) ** 2 + (a[1] - c[1]) ** 2 + (a[2] - c[2]) ** 2) 5 bc = np.sqrt((b[0] - c[0]) ** 2 + (b[1] - c[1]) ** 2 + (b[2] - c[2]) ** 2) 6 s = (ab + ac + bc) / 2.0 7 area = np.sqrt(s * (s - ab) * (s - ac) * (s - bc)) 8 return area 9 def getarea(self): #总片面面积 10 for index in self.faces: 11 self.area = self.area + getarea(self.vertices[index[0]-1], self.vertices[index[1]-1], self.vertices[index[2]-1])
经测试,两个算出来的误差非常小,可以使用。
但是如果用vtk算体积的话,会有误差,可能适合模型封闭性有关。