如何从同一固定视角渲染点云各部分 避免自动居中缩放
问题描述
使用select_points_object_model_3d将完整objectModel3D切分为水平层后,调用render_object_model_3d()渲染各层时,大点云的较小子片段会被自动居中、放大以适配图形窗口,无法保留其在完整点云中的原有尺寸与空间位置。
核心需求:所有渲染输出的点云片段,需和其在完整点云中的尺寸、位置完全一致,同一视角下渲染的各水平层图像可在x、y轴精准对齐。
当前临时方案为构建4个间隔分布的小方块边界对象,和待渲染片段共同传入渲染接口固定渲染范围,避免自动缩放,但该方法实现取巧、鲁棒性差;曾尝试传入位姿参数的方案,因点云经过多次变换后原始相机位姿失效,无法确定正确传入值,未达预期。
现有实现代码
分层渲染核心逻辑
for j := 0 to |ROI_slice_zFrom|-1 by 1 select_points_object_model_3d (scene, 'point_coord_z', ROI_slice_zFrom[j], ROI_slice_zTo[j], slice) render_object_model_3d (rendered_image, [borderObjects, slice], CameraParam, [], colorParam, colorValues) endfor
临时边界对象生成代码
*borderobjects lenUnit := 3500 distLen := 1500 * borderobject poses create_pose (distLen, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', pose0) create_pose (0, distLen, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', pose1) create_pose (-distLen, 0, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', pose2) create_pose (0, -distLen, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', pose3) * offset create_pose (-3000, -3000, 0, 0, 0, 0, 'Rp+T', 'gba', 'point', borderObjects_XYoffset) * composed poses pose_compose (pose0, borderObjects_XYoffset, pose0) pose_compose (pose1, borderObjects_XYoffset, pose1) pose_compose (pose2, borderObjects_XYoffset, pose2) pose_compose (pose3, borderObjects_XYoffset, pose3) * borderobject gen_object_model_3d_from_points (lenUnit, lenUnit, lenUnit, borderObject) * borderobjects rigid_trans_object_model_3d (borderObject, pose0, borderObject_trans0) rigid_trans_object_model_3d (borderObject, pose1, borderObject_trans1) rigid_trans_object_model_3d (borderObject, pose2, borderObject_trans2) rigid_trans_object_model_3d (borderObject, pose3, borderObject_trans3) borderObjects := [borderObject_trans0, borderObject_trans1, borderObject_trans2, borderObject_trans3]
规范解决方案
不需要额外构造边界对象,直接通过render_object_model_3d的原生通用参数固定渲染视窗范围即可,实现逻辑如下:
- 渲染分层前先获取完整场景点云的空间包围盒
* 输出顺序为[min_x, min_y, min_z, max_x, max_y, max_z] get_object_model_3d_params (scene, 'bounding_box1', BoundingBox) - 提前定义固定渲染范围的通用参数,强制渲染器使用完整点云的xy范围作为投影边界,关闭自动适配缩放
GenParamNames := ['disp_background', 'window_extent_min_x', 'window_extent_min_y', 'window_extent_max_x', 'window_extent_max_y'] GenParamValues := ['false', BoundingBox[0], BoundingBox[1], BoundingBox[3], BoundingBox[4]] - 所有切片渲染复用同一组固定视窗参数,无需附加边界对象
for j := 0 to |ROI_slice_zFrom|-1 by 1 select_points_object_model_3d (scene, 'point_coord_z', ROI_slice_zFrom[j], ROI_slice_zTo[j], slice) render_object_model_3d (rendered_image, slice, CameraParam, [], GenParamNames, GenParamValues) endfor
若点云经过刚体变换,只需在计算包围盒前将所有变换应用到原始
scene对象上再读取包围盒即可,无需手动计算相机位姿,所有切片渲染投影范围完全统一,输出的各层图像x、y轴可完全对齐。
内容的提问来源于stack exchange,提问作者Malinko
相关产品推荐
相关产品推荐

