LabVIEW 3D Picture Overly

我们熟悉LabVIEW控件的同学基本都用过在控件上面增加一些图像,比如,波形图、强度图、XY图都有一个属性“Plot Images” 我们可以利用“前景图像”在控件前面增加想绘制的内容。NI Vision工具包本身就带有Overly函数选版,允许我们在图像前增加相关内容,有了Overly功能大大方便了相关程序的开发,比如,标注、框选等提示内容。

LabVIEW 3D Picture控件是LabVIEW进行三维渲染的控件,该控件没有提供相关属性用于Overly内容,并且3D Picture控件必须叠放在所有控件的最前端,当我们需要在3D Picture控件前面增加Overly,常用的方法几乎不太可能。但很多交互是需要我们识别及选中三维控件渲染的对象的,此时Overly一个选中范围框就非常有必要,如何实现?

LabVIEW 3D Picture控件必须叠放在最前端,如果要实现一个选中范围框的功能,我们只能在三维控件里面渲染一个三维选中线框,而这个三维线框刚好在3D Picture控件的最前端,来实现这个这个Overly功能。如下图所示:

图片

第一个问题:如何实现三维控件的Overly?

那我首先介绍下,三维渲染视角坐标系,如下图所示:

图片

红色不部分是不可见部分,可见部分在Near与Far平面之间。而LabVIEW3D Picture控件最前端相当于Near平面,所有渲染的对象在Near与Far平面之间,景深之内。幸运的是LabVIEW 3D Picture控件提供了“WindowToObjectCooeds”方法,用于

LabVIEW 3D Picture控件之上的像素值到三维渲染空间坐标系内的坐标值转换。该方法返回三维坐标系下近平面坐标值和远平面坐标值(注意是三维对象坐标系而不是相机坐标系),另外,Near是可见部分与不可见部分的分界截面,为了很好的显示这个“Overly”,我们需要在远平面点与近平面点计算的法向上向可见部分移动非常小的位移,保证绘制的三维线框都在可见部分。

第二个问题:如何实现绘制的线框与兔子之间的对应关系?

要搞明白这个问题,我们要清楚LabVIEW 3D Picture控件是如何渲染真实三维对象的。如下图所示:

图片

首先通过ModeViewMatrix将真实坐标系转换到相机坐标系,如下图所示:

图片

橙色部分是平移量、黄色部分是旋转矩阵、紫色部分是缩放量。也就是三维对象要通过这个4*4矩阵转化到相机坐标系。LabVIEW 3D Picture控件提供该属性,返会当前视角的ModeViewMatrix。

投影:三维物体要在LabVIEW 3D Picture控件中显示,需要将数据投影到屏幕最前端,

此时需要使用ProjectionMatrix 矩阵(LabVIEW 3D Picture控件提供该属性)来完成投影。LabVIEW提供Orthographic与Perspective两种方法进行投影,区别如下图所示:

图片

三维物体要在LabVIEW 3D Picture提供属性如下:

图片

我们理解了三维对象是如何在LabVIEW 3D Picture控件中渲染的,那控件最前端的框选就可以与真实三维数据进行对应了,如下图所示:

图片

另外:

我之前的文章提到过,LabVIEW三维控件使用PickPoint方法是没法识别点、线三维对象的,可以采用本文提到的方法进行识别。

LabVIEW 3D Picture Set Background Image

熟悉这个控件的同学都有注意到,这个背景颜色是可以通过BackgroundColor属性来设置,但是只能是纯色,比如背景我想设置一个漂亮的图片,常规的方法没法实现。

我们依然可以采用“WindowToObjectCooeds”将控件的大小转换为Far平面的4个顶点坐标,绘制一个三维4边形,并将该图片应用为该三维4边形的纹理,鼠标移动后重新重复该过程,使得该图片永远在视角的最远端,实现了图片作为三维控件背景的功能。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/221866.html

(0)
联系我们
联系我们
分享本页
返回顶部