3D mesh 的edge_collapse代码。

该代码示例展示了如何使用Python的trimesh库处理3D网格模型。主要功能包括:导出OBJ文件,显示点云和网格,以及执行边缘塌陷操作以减少模型的顶点数。在边缘塌陷过程中,选定的边的两个顶点被合并成一个新顶点,同时更新相关的三角面和边信息,以确保拓扑正确性。最后,检查剩余顶点的度数以避免产生小于3度的顶点。
摘要由CSDN通过智能技术生成
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')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值