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

Python 如何计算三角形面网格的质心?,python,c++,math,3d,mesh,Python,C++,Math,3d,Mesh,我想为网格计算一个新的质心,如下所述。但我不想使用Blender的内置函数来计算质心,因为它们似乎没有给出我期望得到的质心。首先,我想计算网格质心的面中心(三角形)。然后我需要计算面面积。新质心是网格面中心的平均值,由其面积加权。如何在Python中做到这一点(但不一定使用Blender的Python API)?让我们用3个顶点定义每个三角形p0、p1、p2中心很简单 center = (p0+p1+p2) /3 它只是形成它的所有顶点的平均值。面积可通过叉积计算,如下所示: area = 0

我想为网格计算一个新的质心,如下所述。但我不想使用Blender的内置函数来计算质心,因为它们似乎没有给出我期望得到的质心。首先,我想计算网格质心的面中心(三角形)。然后我需要计算面面积。新质心是网格面中心的平均值,由其面积加权。如何在Python中做到这一点(但不一定使用Blender的Python API)?

让我们用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\u sum=0.0;
vec3质心=vec3(0.0,0.0,0.0);

对于(int i=0;i请注意,Spektre的答案给出了网格表面积的质心,这可能是您想要的

如果希望取而代之的是网格体积的中心(如假设密度恒定的质心),则需要执行以下操作:

  • 使用三角形的3个顶点加上原点,从每个三角形创建一个四面体
  • 计算每个四面体的有符号体积和中心
  • 将体积和体积加权中心相加
  • 通过将体积加权中心之和除以总体积来获得网格中心
  • 伪代码:

    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
    

    你的描述正是我将如何进行的,尽管我以前从未这样做过。哪一部分给你带来了麻烦?@MarkRansom我想说的是计算三角形的面积和获得质心点的最后一步。我不完全确定最后的标准化步骤。当你去展示至少一点理解和努力。没有人愿意为你做所有的工作。编辑问题以显示你已经理解的部分。