Spaces:
Running on Zero
Running on Zero
| import torch | |
| import o_voxel | |
| import trimesh | |
| import trimesh.visual | |
| RES = 512 | |
| # Load data | |
| coords, data = o_voxel.io.read("ovoxel_helmet.vxz") | |
| dual_vertices = data['dual_vertices'] | |
| intersected = data['intersected'] | |
| base_color = data['base_color'] | |
| metallic = data['metallic'] | |
| roughness = data['roughness'] | |
| alpha = data['alpha'] | |
| # Depack | |
| dual_vertices = dual_vertices / 255 | |
| intersected = torch.cat([ | |
| intersected % 2, | |
| intersected // 2 % 2, | |
| intersected // 4 % 2, | |
| ], dim=-1).bool() | |
| # Extract Mesh | |
| # O-Voxel connects dual vertices to form quads, optionally splitting them | |
| # based on geometric features. | |
| rec_verts, rec_faces = o_voxel.convert.flexible_dual_grid_to_mesh( | |
| coords.cuda(), | |
| dual_vertices.cuda(), | |
| intersected.cuda(), | |
| split_weight=None, # Auto-split based on min angle if None | |
| grid_size=RES, | |
| aabb=[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], | |
| ) | |
| # Save as ply | |
| visual = trimesh.visual.ColorVisuals( | |
| vertex_colors=base_color, | |
| ) | |
| mesh = trimesh.Trimesh( | |
| vertices=rec_verts.cpu(), faces=rec_faces.cpu(), visual=visual, | |
| process=False | |
| ) | |
| mesh.export("rec_helmet.ply") | |