File size: 1,457 Bytes
491eded
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np
import trimesh
import torch


def normalize_scene(scene, rg=(-0.5, 0.5)):
    # put to [-0.5, 0.5]
    whole_center = scene.bounding_box.centroid
    scene.apply_translation(-whole_center)
    whole_scale = max(scene.bounding_box.extents)
    scene.apply_scale((rg[1]-rg[0]) / whole_scale)
    return scene

def normalize_mesh(mesh, rg=(-1,1)):
    # put to [-1, 1]
    vmin = mesh.vertices.min(axis=0)
    vmax = mesh.vertices.max(axis=0)
    center = (vmin + vmax) / 2
    scale = (vmax - vmin).max()
    mesh.vertices = (mesh.vertices - center) / scale * (rg[1] - rg[0]) + (rg[0] + rg[1]) / 2

def change_mesh_range(mesh, from_rg=(-1,1), to_rg=(-1,1)):
    mesh.vertices = (mesh.vertices - (from_rg[0] + from_rg[1]) / 2) / (from_rg[1] - from_rg[0]) * (to_rg[1] - to_rg[0]) + (to_rg[0] + to_rg[1]) / 2
    return mesh

def change_pcd_range(pcd, from_rg=(-1,1), to_rg=(-1,1)):
    pcd = (pcd - (from_rg[0] + from_rg[1]) / 2) / (from_rg[1] - from_rg[0]) * (to_rg[1] - to_rg[0]) + (to_rg[0] + to_rg[1]) / 2
    return pcd

def quantize_vertices(v, bins):
    return (v * bins).astype(np.int32)

def sample_points(mesh, n):
    points, face_index = trimesh.sample.sample_surface(mesh, n)
    normals = mesh.face_normals[face_index]
    return points, normals

def clear_mesh(mesh):
    mesh.update_faces(mesh.nondegenerate_faces(height=1.e-8))
    mesh.remove_unreferenced_vertices()
    mesh.merge_vertices(digits_vertex=0)
    return mesh