opsiclear-admin's picture
Upload folder using huggingface_hub
648cdec verified
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")