import trimesh
import numpy as np
import os
import pyvista as pv
def output_obj(vs, faces, name):
# one_pl = np.squeeze(one_pl)
#
# vs = []
#
# for vert_iter in range(len(one_pl)):
# vs.append(one_pl[vert_iter])
name = name + '.obj'
path = 'distur_datasets'
if not os.path.exists(path):
os.makedirs(path)
filename = path + '\\' + name
with open(filename, 'w') as file_object:
for i in range(len(vs)):
file_object.write("v {} {} {}\n".format(vs[i][0], vs[i][1], vs[i][2]))
for i in range(len(faces)):
file_object.write("f {} {} {}\n".format(faces[i][0] +1 , faces[i][1] +1 , faces[i][2] +1 ))
def show_pl(mesh,pointclouds_pl_adv , special_index):
#pointclouds_pl_adv=pointclouds_pl_adv.squeeze()
p = pv.Plotter()
camera = pv.Camera()
camera.position = (18,4,-20)
camera.focal_point = (0,0,0)
p.add_mesh(mesh, color="white", point_size=10, render_points_as_spheres=True)
# for i in range(len(special_index)):
# p.add_mesh(pv.PolyData(pointclouds_pl_adv[i]), color=[1, 0, 0], point_size=np.float(11),
# render_points_as_spheres=True)
for i in range(len(pointclouds_pl_adv)):
if i in special_index:
p.add_mesh(pv.PolyData(pointclouds_pl_adv[i]), color=[255, 0, 0], point_size=np.float(12) , render_points_as_spheres=True) #5
else:
p.add_mesh(pv.PolyData(pointclouds_pl_adv[i]), color=[0, 0, 0], point_size=np.float(11), render_points_as_spheres=True)
p.add_background_image('D:\\Desktop\\w.jpg') # 使用白色图片作为背景
p.camera = camera
p.show()
def collapse_edge(mesh, edge_index):
vertices = mesh['vertices']
triangles = mesh['triangles']
edge = mesh['edges'][edge_index]
v_collapse1 = edge[0]
v_collapse2 = edge[1]
#show_pl(o_obj, vertices, [v_collapse1, v_collapse2])
# 删除该边
mesh['edges'] = np.delete(mesh['edges'], edge_index, axis=0)
# 删除该边所在的三角形
triangle_indices = np.where((triangles == edge[0]).sum(axis=1) + (triangles == edge[1]).sum(axis=1) == 2)[0]
triangles = np.delete(triangles, triangle_indices, axis=0)
o_obj.faces = triangles
#show_pl(o_obj, vertices, [None])
# 将该边的两个顶点合并为一个顶点
if edge[0] < edge[1]:
save_v_index = edge[0]
delet_v_index = edge[1]
else:
save_v_index = edge[1]
delet_v_index = edge[0]
new_vertex = (vertices[save_v_index] + vertices[delet_v_index]) / 2
mesh['vertices'][save_v_index] = new_vertex
# 更新所有使用该边顶点的三角形
# for triangle in triangles:
# triangle[np.where(triangle == edge[1])] = edge[0]
for i in range(len(triangles)):
triangles[i][np.where(triangles[i] == delet_v_index)] = save_v_index
for i in range(len(triangles)):
#ii = np.where(np.array([11,1,1]) == 1)
ii = np.where(triangles[i] > delet_v_index)
if not ii[0].size == 0:
triangles[i][ii] = triangles[i][ii] - 1
#triangles[i][np.where(triangles[i] > delet_v_index)] = triangles[i][np.where(triangles[i] > delet_v_index)] - 1
for i in range(len(mesh['edges'])):
#ii = np.where(np.array([11,1,1]) == 1)
ii = np.where(mesh['edges'][i] > delet_v_index)
if not ii[0].size == 0:
mesh['edges'][i][ii] = mesh['edges'][i][ii] - 1
mesh['vertices'] = np.delete(vertices, delet_v_index, axis=0)
vertex_degree = {}
for edge in mesh['edges']:
for vertex in edge:
if vertex in vertex_degree:
vertex_degree[vertex] += 1
else:
vertex_degree[vertex] = 1
min_degree1 = min(vertex_degree.values())
output_obj(mesh['vertices'], triangles, 'temp')
obj_collaps = trimesh.load('distur_datasets\\temp.obj')
#show_pl(obj_collaps, obj_collaps.vertices, [None])
vertex_degree = {}
for edge in obj_collaps.edges:
for vertex in edge:
if vertex in vertex_degree:
vertex_degree[vertex] += 1
else:
vertex_degree[vertex] = 1
min_degree = min(vertex_degree.values())
print('min_degree:{}'.format(min_degree))
print('min_degree1:{}'.format(min_degree1))
if min_degree < 3 or min_degree1 < 3:
print('########wrong########')
print('hello')
if __name__ == '__main__':
for index in range(200):
o_obj = trimesh.load('T576.obj')
mesh = {'vertices': o_obj.vertices, 'triangles': o_obj.faces, 'edges': o_obj.edges}
collapse_edge(mesh, index)
# o_obj = trimesh.load('T124.obj')
# o_v = o_obj.edges
# o_f = o_obj.faces
# o_e = o_obj.vertices
#
# # 选定想要collapse的边
# e_collapse = 145
# v_collapse1 = o_v[e_collapse][0]
# v_collapse2 = o_v[e_collapse][1]
# show_pl(o_obj, o_e, [v_collapse1, v_collapse2])
#
# # 计算两条边的中点为目标点
# mid_v = (o_v[v_collapse1] + o_v[v_collapse2]) / 2
#
# # 删除包含目标边的面
# delete_face = []
# for i in range(len(o_f)):
# if v_collapse1 in o_f[i] and v_collapse2 in o_f[i]:
# delete_face.append(i)
#
# # for i in range(len())
# #
# # show_pl(o_obj, o_e,)
#
#
# # 改变包含目标边其中一个顶点的面的索引 指向新的目标点
#
# # 检查是否产生2度边
print('hellp')
3D mesh 的edge_collapse代码。
最新推荐文章于 2024-08-03 16:41:09 发布
该代码示例展示了如何使用Python的trimesh库处理3D网格模型。主要功能包括:导出OBJ文件,显示点云和网格,以及执行边缘塌陷操作以减少模型的顶点数。在边缘塌陷过程中,选定的边的两个顶点被合并成一个新顶点,同时更新相关的三角面和边信息,以确保拓扑正确性。最后,检查剩余顶点的度数以避免产生小于3度的顶点。
摘要由CSDN通过智能技术生成