1. 参数说明
- WindowHandle:显示点云的窗口句柄
- ObjectModel3D:待显示的点云对象
- CamParam:相机内参
- 此处的相机指的是一个虚拟相机,为观察点云提供一个视角,如下图,点云在一个场景坐标系中(SCS),我们在WindowHandle中看到的点云效果就是通过此虚拟相机看到的点云
- 该值可以为空,如果为空,函数内部会根据窗口的width、height默认生成一组相机内参
- PoseIn:点云的初始位姿,按照指定的位姿显示点云,可以为空,为空是算子内部会自己计算一个初始位姿
- GenParamName、GenParamValue:设置渲染点云时的颜色、文字等参数,具体参考文档
- PoseOut:输出点云的当前位姿,被用户操作过的点云当前位姿
2. 算子原理
这个算子提供了我们最需要的两个核心功能:
- 点云渲染
- 鼠标交互:
- 鼠标左键长按:控制点云旋转
- 鼠标左键长按+Ctrl键:控制点云XY方向平移
- 鼠标左键长按+Shift键:控制点云沿着Z轴平移,用户的感受为点云的放大和缩小
- 鼠标右键单选某个点云:右键选定时,点云的透明度为降低,该点云被禁用,后续的鼠标交互操作对该点云没有作用
2.1. 点云渲染
渲染部分,使用的是3D Scene相关的算子,如display_scene_3d、具体可以参考帮助文档中的说明,HALCON已经封装的很好,也很容易理解
2.2. 鼠标交互
鼠标交互看起来比较复杂,主要由该算子内部analyze_graph_event算子实现,其解析鼠标事件,根据不同的鼠标事件类型做不同的处理,基本处理思路为:将鼠标的位置变化转换为点云的位姿变化
2.2.1. 点云旋转
鼠标移动,输入为鼠标的起始点和结束点(图像坐标系),最后输出一个旋转四元数:
- 将起始点和结束点投影到virtual trackball上,得到三维空间的两个向量,project_point_on_trackball算子提供了Shoemake算法和Bell算法,具体原理可以参考文献
- 两个向量的叉乘得到旋转轴,并计算出旋转角,
- 使用axis_angle_to_quat算子计算出对应的四元数
- 将四元数转为位姿旋转矩阵
- 修改点云在场景坐标系中的位姿
- 调用display_scene_3d刷新点云
2.2.2. XY平移
鼠标两个点(图像坐标系)的坐标反投影到Camera坐标系(使用了get_line_of_sight算子),计算在Camera坐标系中的两个点的XY方向的平移量,然后修改点云位姿中XY方向的值即可
简单用两个点测试一下:
dev_get_window (WindowHandle)
get_window_extents (WindowHandle, Row, Column, Width, Height)
gen_cam_par_area_scan_division (0.008, 0, 5.2e-006, 5.2e-006, Width*0.5, Height*0.5, Width, Height, CameraParam)
** 将图像坐标系中的点反向投影到相机坐标系中
get_line_of_sight (100, 120, CameraParam, PX, PY, PZ, QX1, QY1, QZ1)
get_line_of_sight (100, 220, CameraParam, PX, PY, PZ, QX2, QY2, QZ2)
** 将相机坐标系上的点投影到图像坐标系上
project_3d_point (QX1, QY1, QZ1, CameraParam, Row1, Column1)
***** Row1 = 100
***** Column1 = 120
** 手动验证,与project_3d_point结果一致
** u=x/dx + u(0)
** v=y/dy + v(0)
U_Col := QX1 / 5.2e-006 + Width*0.5
V_Row := QY1 / 5.2e-006 + Height*0.5
** U_Col = 120
2.2.3. Z方向平移
鼠标在窗口中上Y方向的平移代表点云Z方向的平移量,同样只需更改点云位姿中Z方向的值即可文章来源:https://www.toymoban.com/news/detail-628742.html
3. HSmartWindowControlWPF 实现点云渲染和鼠标交互
文章来源地址https://www.toymoban.com/news/detail-628742.html
到了这里,关于HALCON visualize_object_model_3d 算子原理的理解以及使用HSmartWindowControlWPF重实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!