使用trimesh将顶点子集及关联面转为网格的方法与步骤咨询
使用trimesh从顶点子集与关联面创建网格的方法
完全可以用trimesh实现这个需求,但必须注意面索引的重新映射,不能直接用原面的索引集合,否则新网格会因为索引不匹配而报错或生成错误模型。
你的思路方向是对的,但缺少关键的索引转换步骤——原网格的面中存储的是原顶点数组的索引,当你提取顶点子集后,新顶点数组的索引和原索引已经对应不上了,必须把关联面中的每个顶点索引替换为它在新顶点子集里的位置。
修正后的完整代码示例
import trimesh # 加载原网格 mesh = trimesh.load("cube.obj") # 1. 筛选目标顶点(替换成你的vertSubsetGenerator逻辑) selected_vert_indices = [0, 1, 2, 3, 4] # 原网格中要保留的顶点下标 subVertices = mesh.vertices[selected_vert_indices] # 2. 建立原顶点索引到新子集索引的映射 vert_index_map = {old_idx: new_idx for new_idx, old_idx in enumerate(selected_vert_indices)} # 3. 筛选关联面并转换索引(替换成你的faceSubsetGenerator逻辑) subFaces = [] for face in mesh.faces: # 只保留所有顶点都在选中集合里的面 if all(vert in vert_index_map for vert in face): # 将原面的顶点索引替换为新子集的索引 new_face = [vert_index_map[vert] for vert in face] subFaces.append(new_face) # 4. 创建并保存新网格 if subFaces: meshOut = trimesh.Trimesh(vertices=subVertices, faces=subFaces) meshOut.export("sub_mesh.obj") else: print("未找到符合条件的关联面,无法生成有效网格")
关键注意事项
- 必须丢弃包含未选中顶点的面,否则新网格会出现顶点索引越界问题。
- 索引映射是核心步骤,省略这一步会导致新网格的面指向错误的顶点位置。
内容的提问来源于stack exchange,提问作者hdbgdz
相关产品推荐
相关产品推荐

