Spaces:
Runtime error
Runtime error
| 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 |