- 【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻
- 【3D入门-指标篇下】 3D重建评估指标对比-附实现代码
- 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
Mesh 数据结构解析
1. Vertices(顶点)
python
original_vertices = mesh_full.vertices
定义:
- vertices 是3D空间中的点坐标
- 每个顶点用
(x, y, z)
坐标表示 - 形状:
[N, 3]
,其中 N 是顶点数量
示例:
python
vertices = [
[0.0, 0.0, 0.0], # 顶点0:原点
[1.0, 0.0, 0.0], # 顶点1:x轴上的点
[0.0, 1.0, 0.0], # 顶点2:y轴上的点
[0.0, 0.0, 1.0], # 顶点3:z轴上的点
]
2. Faces(面片)
python
original_faces = mesh_full.faces
定义:
- faces 是由顶点索引组成的三角形面片
- 每个面片由3个顶点索引定义
- 形状:
[M, 3]
,其中 M 是面片数量
示例:
python
faces = [
[0, 1, 2], # 面片0:由顶点0、1、2组成
[0, 2, 3], # 面片1:由顶点0、2、3组成
[0, 3, 1], # 面片2:由顶点0、3、1组成
[1, 3, 2], # 面片3:由顶点1、3、2组成
]
3. 顶点和面片的关系
索引对应:
python
# 面片 [0, 1, 2] 表示:
# - 第0个顶点:(0.0, 0.0, 0.0)
# - 第1个顶点:(1.0, 0.0, 0.0)
# - 第2个顶点:(0.0, 1.0, 0.0)
# 这三个顶点连接形成一个三角形面片
可视化理解:
顶点索引: 0 → 1 → 2 → 0
坐标: (0,0,0) → (1,0,0) → (0,1,0) → (0,0,0)
形成一个三角形面片
4. 为什么这样设计?
内存效率:
python
# 不重复存储顶点坐标
vertices = [[x1,y1,z1], [x2,y2,z2], ...] # 存储一次
# 面片只存储索引
faces = [[0,1,2], [0,2,3], ...] # 引用顶点索引
拓扑结构:
python
# 面片定义了网格的拓扑关系
# 哪些顶点相连
# 哪些面片相邻
# 网格的连通性
5. 在代码中的具体应用
网格分割:
python
origin_num = mesh_full.faces.shape[0] # 获取面片总数
# 分割面片
mesh = trimesh.Trimesh(
vertices=original_vertices, # 所有顶点
faces=original_faces[:origin_num] # 前origin_num个面片
)
mesh_fill = trimesh.Trimesh(
vertices=original_vertices, # 相同的顶点
faces=original_faces[origin_num:] # 剩余的面片
)
为什么顶点不分割?
python
# 顶点是共享的,不需要分割
# 面片定义了不同的几何体
# 一个顶点可能被多个面片使用
6. 实际例子:立方体
python
# 立方体的8个顶点
vertices = [
[0,0,0], [1,0,0], [1,1,0], [0,1,0], # 底面4个顶点
[0,0,1], [1,0,1], [1,1,1], [0,1,1] # 顶面4个顶点
]
# 立方体的12个三角形面片(每个面2个三角形)
faces = [
# 底面
[0,1,2], [0,2,3],
# 顶面
[4,6,5], [4,7,6],
# 侧面
[0,4,1], [1,4,5],
[1,5,2], [2,5,6],
[2,6,3], [3,6,7],
[3,7,0], [0,7,4]
]
7. 在3D处理中的重要性
几何计算:
python
# 法线计算
face_normal = compute_face_normal(vertices[faces[0]])
# 面积计算
face_area = compute_triangle_area(vertices[faces[0]])
# 体积计算
volume = compute_mesh_volume(vertices, faces)
渲染和可视化:
python
# GPU渲染
# 顶点着色器处理顶点
# 片段着色器处理面片
总结
您的理解完全正确:
- Vertices(顶点) :3D空间中的点坐标
[x, y, z]
- Faces(面片) :由顶点索引组成的三角形
[v1, v2, v3]
- 关系:面片通过索引引用顶点,形成完整的3D网格
- 优势:避免重复存储,支持复杂的拓扑结构
这种设计是3D图形学中的标准做法,既高效又灵活!