发布时间:2025-12-09 19:39:34 浏览次数:4
SceneWidget是open3d用以展示三维内容的控件,功能极其强大。考虑到大家都已经受够了斯坦福兔子,今天就用一个古希腊雕塑做案例。
import open3d as o3dimport open3d.visualization.gui as guiimport open3d.visualization.rendering as renderingfrom numpy import random as rdapp = gui.Application.instanceapp.initialize()win = app.create_window("scene", 1024, 768)view3d = gui.SceneWidget()view3d.scene = rendering.Open3DScene(win.renderer)mat = rendering.MaterialRecord()mat.base_color = [1.0,0.94,0.96,1.0]mat.shader = "defaultLit"venus = o3d.io.read_point_cloud("venus.pcd")venus.compute_vertex_normals()view3d.scene.add_geometry("venus", venus, mat)win.add_child(view3d)app.run()效果为
其中,view3d就是通过SceneWidget创建的场景,通过rendering.Open3dScene来选择这个场景的渲染位置。
venus是一个雕塑的点云文件,名字叫沉睡的维纳斯,通过add_geometry这个方法,将venus装载到场景中。
和直接采用o3d.visualization.draw_geometries相比,secene默认挂载的功能并不多,只有旋转拖动。类似+-号调整点尺寸的功能,均需要自行添加。
顾名思义,3D Label就是3D标签,可以在空间中显示,有如下效果,非常炫酷
其代码将venus相关的代码换成如下部分
pts = rd.uniform(-1, 1, size=[100, 3])pc = o3d.geometry.PointCloud()pc.points = o3d.utility.Vector3dVector(pts)colors = rd.uniform(0.0, 1.0, size=[100, 3])pc.colors = o3d.utility.Vector3dVector(colors)view3d.scene.add_geometry("points", pc, mat)for idx in range(0, len(pts)):view3d.add_3d_label(pts[idx], "{}".format(idx))win.add_child(view3d)app.run()其中,add_3d_label就是添加3D标签的方法,与之相对应的是remove_3d_label,可以移除标签。
sceneWidget提供了look_at函数,用于设置视角位置;setup_camera用于设置相机参数。
其中,look_at的输入为三个向量
setup_camera相对复杂,重载了多种不同的构造函数,就参数而言,包括下面几种
setup_camera(field_of_view, model_bounds, center_of_rotation)
setup_camera(intrinsics, extrinsic, model_bounds)
setup_camera(intrinsic, extrinsic, idth_px, height_px, model_bounds)