如何在Open3D中仅执行一次3D模型旋转变换?
解决Open3D中3D模型无限旋转的问题
问题原因
你使用register_animation_callback注册的回调函数会每帧被自动调用一次,每次调用都执行obj_mesh.rotate(...)给模型施加10°俯仰旋转,这就导致模型持续无限旋转,而非单次旋转。
解决方法
根据需求选择以下两种方案:
方案1:模型初始化时单次旋转
如果只需要模型加载完成后自动旋转一次,直接在加载模型后执行旋转操作,无需使用动画回调:
from colorama import init import numpy as np import open3d as o3d import cv2 obj_path = "Compressor HD.obj" if __name__ == "__main__": vis = o3d.visualization.VisualizerWithKeyCallback() vis.create_window() # 加载3D模型并计算法向量 obj_mesh = o3d.io.read_triangle_mesh(obj_path) obj_mesh.compute_vertex_normals() # 执行单次俯仰旋转(10°) obj_mesh.rotate(o3d.geometry.get_rotation_matrix_from_xyz(np.radians([10, 0, 0])), center=[0, 0, 0]) vis.add_geometry(obj_mesh) # 添加坐标系 axis_length = 200 coordinate_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=axis_length, origin=[0, 0, 0]) vis.add_geometry(coordinate_frame) vis.run() vis.destroy_window() cv2.destroyAllWindows()
方案2:手动触发单次旋转
如果需要通过按键手动触发旋转,用按键回调替代动画回调,只有按下指定按键时才执行旋转:
from colorama import init import numpy as np import open3d as o3d import cv2 obj_path = "Compressor HD.obj" obj_mesh = None # 按键回调:按下P键执行一次10°俯仰旋转 def rotate_pitch(vis): global obj_mesh obj_mesh.rotate(o3d.geometry.get_rotation_matrix_from_xyz(np.radians([10, 0, 0])), center=[0, 0, 0]) vis.update_geometry(obj_mesh) return False if __name__ == "__main__": vis = o3d.visualization.VisualizerWithKeyCallback() vis.create_window() # 加载3D模型并计算法向量 obj_mesh = o3d.io.read_triangle_mesh(obj_path) obj_mesh.compute_vertex_normals() vis.add_geometry(obj_mesh) # 添加坐标系 axis_length = 200 coordinate_frame = o3d.geometry.TriangleMesh.create_coordinate_frame(size=axis_length, origin=[0, 0, 0]) vis.add_geometry(coordinate_frame) # 注册P键回调 vis.register_key_callback(ord("P"), rotate_pitch) vis.run() vis.destroy_window() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Ja_cpp
相关产品推荐
相关产品推荐

