wushuang98's picture
Upload 197 files
bcb05d1 verified
import torch
import numpy as np
import udf_ext
def compute_valid_udf(vertices, faces, dim=512, threshold=8.0):
if not faces.is_cuda or not vertices.is_cuda:
raise ValueError("Both maze and visited tensors must be CUDA tensors")
udf = torch.zeros(dim**3,device=vertices.device).int() + 10000000
n_faces = faces.shape[0]
udf_ext.compute_valid_udf(vertices, faces, udf, n_faces, dim, threshold)
return udf.float()/10000000.
def normalize_mesh(mesh, scale=0.95):
vertices = mesh.vertices
min_coords, max_coords = vertices.min(axis=0), vertices.max(axis=0)
dxyz = max_coords - min_coords
dist = max(dxyz)
mesh_scale = 2.0 * scale / dist
mesh_offset = -(min_coords + max_coords) / 2
vertices = (vertices + mesh_offset) * mesh_scale
mesh.vertices = vertices
return mesh
def mesh2index(mesh, size=1024, factor=8):
vertices = torch.Tensor(mesh.vertices).float().cuda() * 0.5
faces = torch.Tensor(mesh.faces).int().cuda()
sdf = compute_valid_udf(vertices, faces, dim=size, threshold=4.0)
sdf = sdf.reshape(size, size, size).unsqueeze(0)
sparse_index = (sdf < 4/size).nonzero()
sparse_index[..., 1:] = sparse_index[..., 1:] // factor
latent_index = torch.unique(sparse_index, dim=0)
return latent_index