Spaces:
Running
on
Zero
Running
on
Zero
File size: 1,294 Bytes
bcb05d1 |
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 |
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 |