O-Voxel 原生 3D 表示库:Flexible Dual Grid 网格体素双向转换与 PBR 体积属性全解析
发布时间:2026/10/2 22:05:17来源:尧图网络
人工智能大模型预训练图形学媒体生成【免费下载链接】TRELLIS.2Native and Compact Structured Latents for 3D Generation项目地址https://gitcode.com/GitHub_Trending/tr/TRELLIS.2点击查看免费下载O-Voxel 是 TRELLIS.2 项目中独立维护的稀疏体素原生 3D 表示库核心解决如何把任意拓扑的网格包括非流形、开放表面与稀疏体素之间做即时、高质量的双向转换并原生承载 Base Color、Metallic、Roughness、Opacity 等 PBR 材质属性。读完本文你将掌握 O-Voxel 的核心设计动机Flexible Dual Grid 与 QEF 求解、Mesh→O-Voxel 的几何与材质两条体素化管线、.vxz压缩格式的序列化细节、O-Voxel→Mesh 重建与 GLB 导出全流程以及用于训练过程可视化的稀疏体素渲染器。为什么需要 O-Voxel从场表示到原生体素表示传统 3D 生成与重建方法大多依赖场field表示——例如 Occupancy Field占据场和 SDF符号距离场。这类表示需要水密watertight网格通过昂贵的 SDF 求值、flood-filling 或迭代优化才能与网格互转且难以表达开放表面与非流形拓扑。O-Voxel 换了一条路线直接在稀疏体素网格上定义几何与材质被称为 native 3D representation原生 3D 表示。其几何层采用Flexible Dual Grid柔性双网格公式通过求解一个**增强版 QEFQuadratic Error Function二次误差函数**来确定每个激活体素内的对偶顶点dual vertex位置能够精确捕获尖锐特征sharp features与开放边界open boundaries不需要水密网格材质层将 PBR 属性Base Color、Metallic、Roughness、Opacity作为**体积属性volumetric attributes**与稀疏体素网格对齐存储而不是依赖 UV 贴图。由此带来的工程收益是Mesh ↔ O-Voxel 的转换是**即时instant**的无需 SDF 求值、无需 flood-filling、无需迭代优化配合自定义.vxz压缩格式Z-order/Hilbert 曲线编码可紧凑存储再借助后处理工具可直接导出带 UV 展开与纹理烘培的.glb资产。关键特性一览 Flexible Dual Grid求解增强版 QEF 表示几何精确捕获尖锐特征与开放边界不要求水密网格 体积化 PBR 属性原生支持 Base Color、Metallic、Roughness、Opacity 等物理渲染属性与稀疏体素网格对齐⚡ 即时双向转换快速完成Mesh - O-Voxel转换无需昂贵的 SDF 求值、flood-filling 或迭代优化 高效压缩自定义.vxz格式使用 Z-orderMorton 码/Hilbert 曲线编码紧凑存储稀疏体素结构️ 生产就绪可将转换后的资产直接导出为.glb内置 UV 展开与纹理烘培工具。安装与项目结构O-Voxel 是带有 C/CUDA 扩展的独立 Python 包o-voxel/目录安装方式如下git clone -b main https://github.com/microsoft/TRELLIS.2.git --recursive pip install TRELLIS.2/o_voxel --no-build-isolation--no-build-isolation用于复用环境中已有的构建依赖如 PyTorch、torch 扩展工具链避免隔离环境重复下载。该包依赖其 C 扩展见 src 目录下的convert、hash、io、rasterize、serialize子模块因此需要本地具备编译环境。包顶层模块划分见 o_voxel/init.pyo_voxel.convert网格与 O-Voxel 互转核心算法o_voxel.io.npz/.ply/.vxz文件读写o_voxel.serialize空间哈希与 Z-order/Hilbert 排序o_voxel.rasterize稀疏体素渲染器o_voxel.postprocessGLB 导出网格清理、重网格化、UV 展开、纹理烘培。快速上手 1将网格转换为 O-Voxel含几何与材质双管线以 examples/mesh2ovox.py 为蓝本完整流程包含归一化 → 几何体素化 → 材质体素化 → 排序对齐 → 压缩打包 → 写入 .vxz六个阶段import torch import o_voxel RES 512 asset utils.get_helmet() # 示例资产DamagedHelmet.glbtrimesh 加载 # 0. 归一化到单位立方体aabb 对齐scale 取 0.99999 避免数值问题 aabb asset.bounding_box.bounds center (aabb[0] aabb[1]) / 2 scale 0.99999 / (aabb[1] - aabb[0]).max() asset.apply_translation(-center) asset.apply_scale(scale) # 1. 几何体素化Flexible Dual Grid # 返回占据体素索引、对偶顶点QEF 解、体素边相交标志 mesh asset.to_mesh() vertices torch.from_numpy(mesh.vertices).float() faces torch.from_numpy(mesh.faces).long() voxel_indices, dual_vertices, intersected o_voxel.convert.mesh_to_flexible_dual_grid( vertices, faces, grid_sizeRES, # 网格分辨率 aabb[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], # 轴对齐包围盒 face_weight1.0, # QEF 中面项权重 boundary_weight0.2, # QEF 中边界项权重 regularization_weight1e-2, # QEF 中正则项权重 timingTrue ) # 排序确保几何体素化与材质体素化的索引对齐 vid o_voxel.serialize.encode_seq(voxel_indices) mapping torch.argsort(vid) voxel_indices voxel_indices[mapping] dual_vertices dual_vertices[mapping] intersected intersected[mapping] # 2. 材质体素化体积属性 # 返回材质体素索引与属性 dict含 base_color, metallic, roughness 等 voxel_indices_mat, attributes o_voxel.convert.textured_mesh_to_volumetric_attr( asset, grid_sizeRES, aabb[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], timingTrue ) vid_mat o_voxel.serialize.encode_seq(voxel_indices_mat) mapping_mat torch.argsort(vid_mat) attributes {k: v[mapping_mat] for k, v in attributes.items()} # 3. 打包并保存为压缩 .vxz 格式 dual_vertices dual_vertices * RES - voxel_indices dual_vertices (torch.clamp(dual_vertices, 0, 1) * 255).type(torch.uint8) intersected (intersected[:, 0:1] 2 * intersected[:, 1:2] 4 * intersected[:, 2:3]).type(torch.uint8) attributes[dual_vertices] dual_vertices attributes[intersected] intersected o_voxel.io.write(ovoxel_helmet.vxz, voxel_indices, attributes)深入mesh_to_flexible_dual_grid的参数与 QEF 权重从 flexible_dual_grid.py 的签名可以确认mesh_to_flexible_dual_grid(vertices, faces, voxel_sizeNone, grid_sizeNone, aabbNone, face_weight1.0, boundary_weight1.0, regularization_weight0.1, timingFalse)voxel_size与grid_size二选一必填前者指定每个体素的物理尺寸后者指定网格分辨率两者都是体素尺寸的等价描述方式函数内部断言voxel_size is not None or grid_size is not Noneaabb可省略省略时按网格自动计算显式给出[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]]可与归一化到单位立方体的资产严格对齐QEF 三项权重决定对偶顶点在体素内的落点face_weight面项权重驱使对偶顶点贴近被体素穿过的原始三角面boundary_weight边界项权重用于保持开放边界/边缘特征示例中取0.2以兼顾边界保留regularization_weight正则项权重防止对偶顶点退化漂移示例取1e-2。返回三元组占据体素索引(N, 3)、对偶顶点、体素边相交标志三个分量分别表示体素三条轴方向上的相交情况。为什么一定要排序对齐几何体素化与材质体素化是两条独立的 CUDA 管线产出的体素索引顺序不一定一致。示例代码用o_voxel.serialize.encode_seq将三维坐标编码为 Morton 码后argsort使几何数据与材质数据在体素序上严格一一对应。这一步必不可少否则写入.vxz后base_color会错位到错误的体素上。打包技巧把浮点量压成 uint8为了极致压缩对偶顶点先减去体素索引变为体素内的局部坐标范围[0,1]再乘以255转uint8三轴相交标志被编码为x 2y 4z的单字节位掩码这两者连同材质属性一起作为attributes写入.vxz在读取时按逆过程解包。快速上手 2从 O-Voxel 重建网格以 examples/ovox2mesh.py 为蓝本读取.vxz→ 解包 → 调用flexible_dual_grid_to_mesh重建表面。import torch import o_voxel import trimesh import trimesh.visual RES 512 # 加载数据 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] # 解包与打包过程互逆 dual_vertices dual_vertices / 255 intersected torch.cat([ intersected % 2, intersected // 2 % 2, intersected // 4 % 2, ], dim-1).bool() # 提取网格O-Voxel 连接对偶顶点生成四边形 # 并可按几何特征将其拆分拆分为三角面 rec_verts, rec_faces o_voxel.convert.flexible_dual_grid_to_mesh( coords.cuda(), dual_vertices.cuda(), intersected.cuda(), split_weightNone, # 传 None 时基于最小角度自动决定是否拆分 grid_sizeRES, aabb[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], ) # 保存为带顶点颜色的 PLY visual trimesh.visual.ColorVisuals(vertex_colorsbase_color) mesh trimesh.Trimesh( verticesrec_verts.cpu(), facesrec_faces.cpu(), visualvisual, processFalse ) mesh.export(rec_helmet.ply)要点四边形网格flexible_dual_grid_to_mesh将相邻体素内的对偶顶点连接成四边形这是 Dual Grid 类方法的天然输出split_weightNone自动拆分当四边形对角角度退化时自动按最小角度拆分为两个三角形显式传入数值可控制拆分强度用于在保持四边形拓扑与保证三角质量之间权衡解包与打包严格互逆/255还原对偶顶点浮点值位掩码按%2、//2%2、//4%2还原三轴相交布尔标志重建结果可直接以 PLY点云/网格形式保存或用下面的流程导出 GLB。快速上手 3导出标准 GLB 资产UV 展开 纹理烘培体素表示适合生成与计算但不适合直接放进标准 3D 查看器。o_voxel.postprocess.to_glb提供了一条完整的生产级后处理管线网格清理 → 重网格化/减面 → UV 展开 → 将体积属性烘培成纹理。以 examples/ovox2glb.py 为蓝本import torch import o_voxel RES 512 # 加载与解包同上省略 coords, data o_voxel.io.read(ovoxel_helmet.vxz) # ... dual_vertices / intersected 解包 ... rec_verts, rec_faces o_voxel.convert.flexible_dual_grid_to_mesh( coords.cuda(), dual_vertices.cuda(), intersected.cuda(), split_weightNone, grid_sizeRES, aabb[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], ) # 后处理拼接体积属性并声明布局 attr_volume torch.cat([base_color.cuda(), metallic.cuda(), roughness.cuda(), alpha.cuda()], dim-1) / 255 attr_layout {base_color: slice(0,3), metallic: slice(3,4), roughness: slice(4,5), alpha: slice(5,6)} mesh o_voxel.postprocess.to_glb( verticesrec_verts, facesrec_faces, attr_volumeattr_volume, coordscoords.cuda(), attr_layoutattr_layout, grid_sizeRES, aabb[[-0.5,-0.5,-0.5],[0.5,0.5,0.5]], decimation_target100000, # 目标面数减面到约 10 万面 texture_size2048, # 烘培纹理分辨率 verboseTrue, ) mesh.export(rec_helmet.glb)关键参数attr_layout声明拼接后的attr_volume中每个属性占据的通道切片to_glb据此把各通道烘培到对应纹理如 Metallic 单独占 1 通道可烘培为单通道贴图decimation_target100000对重建网格做减面decimation的目标面数用于平衡文件大小与几何精度texture_size2048UV 展开后烘培纹理的分辨率数值越高细节越丰富、文件越大。快速上手 4直接渲染稀疏体素训练可视化体素表示无需重建网格即可渲染o_voxel.rasterize.VoxelRenderer专为训练过程中的快速可视化设计。以 examples/render_ovox.py 为蓝本import torch import numpy as np import imageio import o_voxel import utils3d RES 512 # 加载数据体素中心位置映射回 [-0.5, 0.5] 归一化空间 coords, data o_voxel.io.read(ovoxel_helmet.vxz) position (coords / RES - 0.5).cuda() base_color (data[base_color] / 255).cuda() # 相机设置utils3d 辅助构造外参/内参 extr utils3d.extrinsics_look_at( eyetorch.tensor([1.2, 0.5, 1.2]), look_attorch.tensor([0.0, 0.0, 0.0]), uptorch.tensor([0.0, 1.0, 0.0]) ).cuda() intr utils3d.intrinsics_from_fov_xy( fov_xtorch.deg2rad(torch.tensor(45.0)), fov_ytorch.deg2rad(torch.tensor(45.0)), ).cuda() # 渲染 renderer o_voxel.rasterize.VoxelRenderer( rendering_options{resolution: 512, ssaa: 2} # ssaa超采样抗锯齿倍率 ) output renderer.render( positionposition, # 体素中心 attrsbase_color, # 颜色/透明度等属性 voxel_size1.0/RES, # 单个体素的边长 extrinsicsextr, intrinsicsintr ) # output.attr 为渲染结果图像形状 (C, H, W) image np.clip(output.attr.permute(1, 2, 0).cpu().numpy() * 255, 0, 255).astype(np.uint8) imageio.imwrite(ovoxel_helmet_visualization.png, image)要点position用coords / RES - 0.5将整数体素坐标映射回归一化空间与转换阶段aabb定义保持一致voxel_size1.0/RES与grid_sizeRES对应rendering_options中resolution控制输出分辨率ssaa为超采样倍数2表示 2×2 超采样抗锯齿渲染耗时增加但边缘质量更高渲染输出output.attr是(C, H, W)的张量可直接转成图像保存非常适合在训练循环中快速检查中间结果。.vxz文件格式稀疏体素的紧凑存储O-Voxel 支持三种 I/O 格式见 io 模块格式说明推荐度.npzNumPy 格式便于调试与互操作一般.ply点云格式便于外部工具读取一般.vxz自定义压缩格式Z-order/Hilbert 排序 多种压缩器推荐.vxz由头文件与二进制数据构成。从 vxz.py 的格式注释可以确认其布局Header文件类型标识3 字节VXZ→ 版本号1 字节当前为 0→ 二进制起始偏移4 字节→ JSON 结构体JSON 结构体包含num_voxel体素数、chunk_size分块大小、filter、compression压缩器、compression_level、raw_size/compressed_size/compress_ratio、attr_interleave以及属性列表attr: [{name, chs}]、分块索引chunks: [{ptr, svo, attr}]二进制数据按 chunk 组织每个 chunk 内部再分 SVO稀疏体素结构段与属性段ptr记录全局偏移、svo/attr记录 chunk 内偏移。压缩器方面源码定义了默认压缩级别映射none0、deflate9、lzma9、zstd22即同时支持 Deflate、LZMA 与 Zstandardzstd三种压缩算法配合 Z-order/Hilbert 曲线排序可显著提升相邻体素的数据局部性从而获得更高压缩比。序列化与空间排序encode_seq/decode_seqserialize.py 提供encode_seq/decode_seq两个核心函数用于在三维坐标 ↔ 一维空间填充曲线编码之间转换Morton 码Z-order按位交织三轴坐标相邻体素在空间上大概率映射到相邻编码数据局部性好Hilbert 曲线相比 Z-order 有更强的空间连续性进一步压缩时效果更佳。它们在前述工作流中承担三个职责将坐标编码后排序以保证几何/材质对齐、为.vxz分块提供有序索引、提升压缩编码效率。底层还涉及空间哈希src/hash 中的 CUDA 实现用于在大分辨率体素网格中快速定位激活体素。API 总览o_voxel.convert—— 网格与 O-Voxel 互转核心mesh_to_flexible_dual_grid确定激活的稀疏体素并基于网格-体素网格相交关系求解 QEF 确定体素内对偶顶点位置flexible_dual_grid_to_mesh重新连接对偶顶点构成表面四边形 可选按特征拆分textured_mesh_to_volumetric_attr将纹理贴图采样进体素空间产出体积化 PBR 属性。对应 C/CUDA 实现位于 src/convertflexible_dual_grid.cpp、volumetric_attr.cpp。o_voxel.io—— 文件读写格式.npzNumPy、.ply点云、.vxz自定义压缩格式推荐函数read()、write()以及 vxz 的read_vxz/read_vxz_info/write_vxz。o_voxel.serialize—— 空间哈希与排序encode_seq/decode_seq三维坐标与 Morton 码Z-order或 Hilbert 曲线编码之间的互转用于高效存储与处理。o_voxel.rasterize—— 体素渲染VoxelRenderer轻量级稀疏体素渲染器用于训练期间的可视化支持 SSAA 超采样。o_voxel.postprocess—— GLB 导出to_glb网格清理、重网格化减面、UV 展开与纹理烘培的完整管线输出可直接导入标准 3D 查看器的.glb资产。在 TRELLIS.2 中的定位从仓库结构看o-voxel/是 TRELLIS.2 仓库内独立构建的底层表示库TRELLIS.2 的生成管线见 trellis2 目录以结构化稀疏表示为核心而 O-Voxel 提供了从任意网格到这种稀疏体素表示的标准转换通道——即data_toolkit中各类数据预处理脚本如 encode_shape_latent.py 等所依赖的底层能力。它把任意拓扑网格 → 稀疏原生 3D 表示 → 压缩存储 → 可视化/导出整条链路封装为高可用的 Python API既服务于 3D 生成模型的训练数据准备也可独立用于 3D 重建与资产管线。更多端到端示例可参考 examples 目录其中的utils.py展示了如何自动下载标准测试资产DamagedHelmet.glb用于跑通全流程。赞分享人工智能大模型预训练图形学媒体生成【免费下载链接】TRELLIS.2Native and Compact Structured Latents for 3D Generation项目地址https://gitcode.com/GitHub_Trending/tr/TRELLIS.2点击查看免费下载相关推荐AirSim 体素网格Voxel Grid生成实战从 Unreal Engine 世界构建 binvox 占用地图并转换 OctomapAirSim 体素网格Voxel Grid生成实战从 Unreal Engine 世界构建 binvox 占用地图并转换 Octomap 本文以 AirS自动驾驶人工智能深度学习强化学习计算机视觉科研Open3D Voxel Block Grid 体素块网格全局稀疏局部稠密的三维场景表示与 TSDF 融合实战Open3D Voxel Block Grid 体素块网格全局稀疏局部稠密的三维场景表示与 TSDF 融合实战 Voxel Block Grid体素块网格计算机视觉图形学3D渲染科学计算macOS VirtualBox VM性能优化技巧如何让你的虚拟机运行更流畅macOS VirtualBox VM性能优化技巧如何让你的虚拟机运行更流畅 想要在VirtualBox中流畅运行macOS虚拟机吗这篇完整的macOS V开发工具上一篇5分钟上手RustDesk Server接口文档从Rustdoc注释到可视化界面全攻略下一篇Patator模块化架构深度解析为什么它比其他暴力破解工具更可靠创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网