如何计算具有三角形面的网格的质心?
How to compute the centroid of a mesh with triangular faces?
我想根据以下描述为我的网格计算一个新的质心。但是我不想使用 Blender 的内置函数来计算质心,正如 here 所解释的那样,因为它们似乎没有给我我期望得到的那种质心。首先,我想计算网格的网格质心的面(三角形)中心。然后我需要计算面部区域。新的质心是网格面中心的平均值,由它们的面积加权。我如何在 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_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,因此您需要调整矢量数学以适应您的 style/environment。如果您不知道如何计算叉积,请看这里:
向量数学在底部...
请注意,Spektre 的答案给出了网格表面积 的质心,这可能是您想要的。
如果您想要网格的中心 volume(例如假设密度恒定的质心),您需要执行以下操作:
- 使用三角形的 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
我想根据以下描述为我的网格计算一个新的质心。但是我不想使用 Blender 的内置函数来计算质心,正如 here 所解释的那样,因为它们似乎没有给我我期望得到的那种质心。首先,我想计算网格的网格质心的面(三角形)中心。然后我需要计算面部区域。新的质心是网格面中心的平均值,由它们的面积加权。我如何在 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_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,因此您需要调整矢量数学以适应您的 style/environment。如果您不知道如何计算叉积,请看这里:
向量数学在底部...
请注意,Spektre 的答案给出了网格表面积 的质心,这可能是您想要的。
如果您想要网格的中心 volume(例如假设密度恒定的质心),您需要执行以下操作:
- 使用三角形的 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