如何使用Open3D将八叉树正确转换为可正常可视化的体素网格
问题原因
无参调用Octree.to_voxel_grid()不会自动从八叉树结构推导体素网格的核心配置参数(体素尺寸、空间原点坐标),返回的VoxelGrid对象内部参数为未初始化的无效值。你查询到的grid_index-2147483648是int32类型的未初始化哨兵值,对应体素位置完全落在可视坐标范围外,因此可视化窗口无任何内容。
修复方案
调用to_voxel_grid()时手动传入与当前八叉树匹配的体素尺寸、原点参数即可,参数可直接从已构建完成的八叉树属性中计算得到,无需额外手动估算。
修正后的可运行代码:
import open3d as o3d import numpy as np N = 2000 armadillo = o3d.data.ArmadilloMesh() mesh = o3d.io.read_triangle_mesh(armadillo.path) pcd = mesh.sample_points_poisson_disk(N) pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()), center=pcd.get_center()) pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3))) octree = o3d.geometry.Octree(max_depth=4) octree.convert_from_point_cloud(pcd, size_expand=0.01) # 计算匹配八叉树配置的体素参数 voxel_size = octree.size / (2 ** octree.max_depth) voxel_grid = octree.to_voxel_grid(voxel_size=voxel_size, origin=octree.origin) o3d.visualization.draw_geometries([voxel_grid])
验证说明
- 转换完成后调用
voxel_grid.get_voxels()会返回正常范围内的网格索引,与八叉树覆盖的空间范围一一对应 - 如需调整体素精细度,可修改八叉树构建时的
max_depth参数:深度值越大,体素尺寸越小,生成的体素网格分辨率越高
内容的提问来源于stack exchange,提问作者Kevin Liu
相关产品推荐
相关产品推荐

