Open3d图形界面之3D显示控件

发布于:2022-11-28 ⋅ 阅读:(696) ⋅ 点赞:(0)

SceneWidget

SceneWidget是open3d用以展示三维内容的控件,功能极其强大。考虑到大家都已经受够了斯坦福兔子,今天就用一个古希腊雕塑做案例。

import open3d as o3d
import open3d.visualization.gui as gui
import open3d.visualization.rendering as rendering
from numpy import random as rd
app = gui.Application.instance

app.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 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的输入为三个向量

  • center:相机所指向的中心位置
  • eye:相机的位置
  • up:规定上方的向量

setup_camera相对复杂,重载了多种不同的构造函数,就参数而言,包括下面几种

setup_camera(field_of_view, model_bounds, center_of_rotation)

  • field_of_view 视场角
  • model_bounds 模型边界
  • center_of_rotation 旋转中心

setup_camera(intrinsics, extrinsic, model_bounds)

  • intrinsics 相机内部矩阵
  • extrinsic 相机外部矩阵

setup_camera(intrinsic, extrinsic, idth_px, height_px, model_bounds)

  • width_px 像素宽
  • height_px 像素高
本文含有隐藏内容,请 开通VIP 后查看