- 【3D入門-指標篇上】3D 網格重建評估指標詳解與通俗比喻
- 【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼
- 【3D 入門-3】常見 3D 格式對比,.glb / .obj / .stl / .ply
Mesh 數據結構解析
1. Vertices(頂點)
original_vertices = mesh_full.vertices
定義:
- vertices 是3D空間中的點坐標
- 每個頂點用
(x, y, z)
坐標表示 - 形狀:
[N, 3]
,其中 N 是頂點數量
示例:
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(面片)
original_faces = mesh_full.faces
定義:
- faces 是由頂點索引組成的三角形面片
- 每個面片由3個頂點索引定義
- 形狀:
[M, 3]
,其中 M 是面片數量
示例:
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. 頂點和面片的關系
索引對應:
# 面片 [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. 為什么這樣設計?
內存效率:
# 不重復存儲頂點坐標
vertices = [[x1,y1,z1], [x2,y2,z2], ...] # 存儲一次# 面片只存儲索引
faces = [[0,1,2], [0,2,3], ...] # 引用頂點索引
拓撲結構:
# 面片定義了網格的拓撲關系
# 哪些頂點相連
# 哪些面片相鄰
# 網格的連通性
5. 在代碼中的具體應用
網格分割:
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:] # 剩余的面片
)
為什么頂點不分割?
# 頂點是共享的,不需要分割
# 面片定義了不同的幾何體
# 一個頂點可能被多個面片使用
6. 實際例子:立方體
# 立方體的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處理中的重要性
幾何計算:
# 法線計算
face_normal = compute_face_normal(vertices[faces[0]])# 面積計算
face_area = compute_triangle_area(vertices[faces[0]])# 體積計算
volume = compute_mesh_volume(vertices, faces)
渲染和可視化:
# GPU渲染
# 頂點著色器處理頂點
# 片段著色器處理面片
總結
您的理解完全正確:
- Vertices(頂點):3D空間中的點坐標
[x, y, z]
- Faces(面片):由頂點索引組成的三角形
[v1, v2, v3]
- 關系:面片通過索引引用頂點,形成完整的3D網格
- 優勢:避免重復存儲,支持復雜的拓撲結構
這種設計是3D圖形學中的標準做法,既高效又靈活!