如何在Open3D的SceneWidget中实现相机视角的保存与恢复?
在Open3D SceneWidget中实现视角的保存与恢复
核心思路
不用纠结实例化Camera类,SceneWidget的视角由ViewControl对象统一管理,直接通过它就能获取和设置所有需要的视角参数,和draw_geometries复制的参数完全对应。
1. 保存视角参数
从Open3DScene的ViewControl中提取关键参数,可保存为字典或序列化到文件:
import open3d as o3d import json def save_view_parameters(scene_widget, save_path="view_params.json"): # 获取场景的ViewControl对象 view_ctrl = scene_widget.scene.get_view_control() # 获取场景包围盒 bbox = scene_widget.scene.get_bounding_box() # 提取所有视角参数 view_params = { "boundingbox_min": bbox.min_bound.tolist(), "boundingbox_max": bbox.max_bound.tolist(), "field_of_view": view_ctrl.get_field_of_view(), "front": view_ctrl.get_front().tolist(), "lookat": view_ctrl.get_lookat().tolist(), "up": view_ctrl.get_up().tolist(), "zoom": view_ctrl.get_zoom() } # 保存到JSON文件 with open(save_path, "w") as f: json.dump(view_params, f, indent=4)
2. 恢复视角参数
加载保存的参数,通过ViewControl的方法逐一设置,最后强制刷新场景:
def load_view_parameters(scene_widget, load_path="view_params.json"): # 加载保存的参数 with open(load_path, "r") as f: view_params = json.load(f) view_ctrl = scene_widget.scene.get_view_control() # 逐一设置视角参数 view_ctrl.set_front(o3d.core.Tensor(view_params["front"])) view_ctrl.set_lookat(o3d.core.Tensor(view_params["lookat"])) view_ctrl.set_up(o3d.core.Tensor(view_params["up"])) view_ctrl.set_zoom(view_params["zoom"]) view_ctrl.set_field_of_view(view_params["field_of_view"]) # 可选:同步包围盒(部分场景需此步骤保证视角匹配) bbox_min = o3d.core.Tensor(view_params["boundingbox_min"]) bbox_max = o3d.core.Tensor(view_params["boundingbox_max"]) scene_widget.scene.set_bounding_box(o3d.geometry.AxisAlignedBoundingBox(bbox_min, bbox_max)) # 强制刷新场景,确保视角立即生效 scene_widget.force_redraw()
适配draw_geometries复制的参数
如果是从draw_geometries复制的参数(比如直接复制到记事本的文本),只需把文本转换成Python字典格式,就能直接套用上面的恢复逻辑——参数名称和格式完全对应,无需额外适配。
内容的提问来源于stack exchange,提问作者VlassisFo
相关产品推荐
相关产品推荐

