如何计算具有三角形面的网格的质心?
How to compute the centroid of a mesh with triangular faces?
我想为我的网格计算一个新的质心,给出以下描述。但是我不想使用Blender的内置函数来计算质心,因为它们似乎没有给我期望得到的那种质心。首先,我想计算网格的网格质心的面中心(三角形)。然后我需要计算面部面积。新质心是网格面中心的平均值,按其面积加权。如何在Python中执行此操作(但不一定使用Blender的Python API)?
请注意,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
让我们定义每个三角形有 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]
是您的面部数组,其中每个面部都有3D矢量p0,p1,p2
。抱歉,我不使用Python,因此您需要根据自己的风格/环境调整矢量数学。如果您不知道如何计算交叉乘积,请查看此处:
- 了解 4x4 齐次变换矩阵
矢量数学在底部...
相关文章:
- 使用对象文件读取三角形数据网格
- 如何从 3D 曲面网格中删除自相交三角形?
- 如何计算具有三角形面的网格的质心?
- 在开放网格中计算三角形的面积
- 三角形网格上的CGAL插值被卡住
- 使用 #CGAL 的 2D 网格的三角形角度
- 重建三角形网格中的所有边
- 如何累积三维三角形网格的边?用c语言计算网格边的算法
- 3D模型文件并从中创建三角形网格
- PhysX地形-Heightfield vs三角形网格
- 如何在现代 OpenGl 中选择网格的顶点或三角形(上面的 3.3)
- 变换反馈丢失了三角形网格的顺序
- 网格三角形上的复杂OpenMP并行化
- 从三角形网格中查找面
- Tetgen:从曲面的给定三角形开始,在不改变曲面连接性的情况下创建新网格
- C++OpenGL大型网格缺少三角形
- 尝试渲染三角形网格(c++)时崩溃
- 三角形网格和粒子的八叉树实现
- 从网格中读取顶点和三角形
- 同一网格的多个图像没有重复的三角形转移