如何计算三角形面网格的质心?

时间:2018-02-22 02:09:51

标签: python c++ math 3d mesh

我想为我的网格计算一个新的质心,给出以下描述。但我不想使用Blender的内置函数来计算质心,正如here所解释的那样,因为看起来它们并没有给我那种我期望得到的质心。首先,我想计算网格的网格质心的面(三角形)的中心。然后我需要计算面部区域。新质心是网格面的中心平均值,按其面积加权。我怎样才能在Python中执行此操作(但不一定使用Blender的Python API)?

2 个答案:

答案 0 :(得分:1)

让每个三角形定义3个顶点p0,p1,p2,中心很容易

center = (p0+p1+p2) /3

它只是形成它的所有顶点的平均值。该区域可以通过交叉乘积计算:

area = 0.5 * | (p1-p0) x (p2-p0) |
area = 0.5 * length(cross( p1-p0, p2-p0 ))

两者只是用不同的符号相同...所以你描述的质心应该像这样计算(在 C ++ 中):

float area_sum=0.0;
vec3 centroid=vec3(0.0,0.0,0.0);
for (int i=0;i<triangles;i++)
 {
 t = triangle[i];
 vec3  center = (t.p0+t.p1+t.p2) /3; 
 float area = 0.5 * length(cross(t.p1-t.p0, t.p2-t.p0));
 centroid += area*center;
 area_sum += area;
 }
centroid /= area_sum;

其中triangle[trianges]是您的面部数组,其中每个面具有p0,p1,p2 3D 向量。抱歉,我不使用 Python ,因此您需要使矢量数学适应您的风格/环境。如果您不知道如何计算交叉产品,请点击此处:

矢量数学在底部...

答案 1 :(得分:1)

请注意,Spektre 的答案给出了网格表面积的质心,这可能是您想要的。

如果您想要网格的中心体积(就像质心假设密度恒定),您需要执行以下操作:

  1. 使用三角形的 3 个顶点加上原点从每个三角形创建一个四面体。
  2. 计算每个四面体的有符号体积和中心
  3. 合计交易量和交易量加权中心
  4. 将体积加权中心的总和除以总体积,得到网格中心

伪代码:

meshVolume = 0
temp = (0,0,0)

for each triangle in mesh (with vertices v1, v2, v3)
  center = (v1 + v2 + v3) / 4          // center of tetrahedron
  volume = dot(v1, cross(v2, v3)) / 6  // signed volume of tetrahedron
  meshVolume += volume
  temp = center * volume

meshCenter = temp / totalVolume