APP下载

改进的射线拾取法在地质体可视化中的应用

2011-05-14王雪莉唐志辉

网络安全与数据管理 2011年15期
关键词:图元鼠标射线

王雪莉,唐志辉

(中国石油大学,山东 东营 257061)

在三维地质体可视化中,不仅要绘制图形,而且要允许操作者能够通过输入设备(如鼠标)来操纵屏幕上的物体,有时还需要获取物体的空间坐标或图形数值,这些都需要以拾取作为实现的基础。基于二维环境的拾取比较容易实现,但是现实生活中更多接触的是三维空间实体,应从三维的角度来解决问题,所以在三维环境下的拾取问题也显得更加重要。

拾取方法有传统的射线拾取法 (Ray-casting)[1-2],Depth ray方法[3]、基于视口空间的拾取法[4]、基于对象缓冲区的拾取法[5]、3D bubble cursor[6]方法等。在这些方法中,基于对象缓冲区的拾取法与三维场景的物体几何形状无关,避免了空间求交的复杂运算,但是拾取的精度较低,且只能拾取可见物体;传统Ray-casting法拾取精度高,但是只能拾取可见物体;基于视口空间的拾取方法要进行多次空间变换,过于复杂;Depth ray和3D bubble cursor方法操作较复杂,更适用于虚拟现实环境中。本文结合Depth ray算法实现了改进了的射线拾取法,能够拾取被遮挡的物体。

1 Ray-casting算法

1.1 Ray-casting算法原理

Ray-casting算法又称为射线投掷法 (简称射线法)。拾取操作指当用户在屏幕上用鼠标点击某个图元,应用程序能返回到该图元的一个标志和某些相关信息。射线拾取算法的一般思想是:得到鼠标点击处的屏幕坐标,并将其转换为客户区坐标,实现视区反变换;然后,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的射线,该射线如果与场景模型的图元相交,则获取该相交图元的信息。因此,从数学角度来看,只要得到射线的方向矢量和射线的出射点就确定了射线方程,最后就可以利用射线判断其与空间一个图元是否相交,从而实现图元的选取。

1.2 Ray-casting算法思路

传统射线拾取法的处理过程大致可以分为以下几个步骤:

(1)检测鼠标点击处的屏幕坐标,并将其转换为客户区坐标,实现视区反变换。

(2)计算射线对应点在观察坐标空间内的坐标。根据投影原理,三维变换相当于通过一个放置在三维世界中的摄像机来观察当前场景的对象。如图1所示,设顶点O处是摄像机,那么,视野的边界就构成了一个视锥体。图1中远近两个裁剪面构成了平截头体,点P和点P′分别在远裁剪面 ABCD和近裁剪面 A′B′C′D′上。点击屏幕上的点P反映到视锥中,就是选中了所有的从点P′到点P的点。对应的情况是,用户单击鼠标获得屏幕上的某一点,即是指定了从视点指向屏幕深处的某一方向,也就确定了屏幕上某条从O点出发的射线(在图中即为OP),这就是拾取射线。

图1 视锥体示意图

对于同一位置上重叠物体的选择问题,解决办法是:从屏幕坐标得到射线之后,分别让重叠的物体与该射线求交,得到交点,然后根据这些与视点的远近确定选择的对象,这样就能够对那些暂时被其他对象遮住的物体进行选取。

(3)将射线点转换到世界坐标空间,得到其在世界坐标系中的坐标。最终的运算要在世界坐标空间中进行,所以要把矢量计算所用的点坐标全部转化到世界坐标空间中,然后在世界坐标空间中求交。

2 Depth ray算法

Depth ray算法[3]是在传统射线法基础上提出的一种新的拾取方法。该方法在射线上设置一个深度标记(depth marker),用户可控制深度标记沿射线移动。拾取时,将场景中的物体与射线求交,然后求相交物体与射线深度标记的距离,其中与深度标记距离最近的物体即被拾取。

图2为Depth ray拾取法示意图,图中直线表示拾取射线,黑色圆点表示深度标记,框中物体是被拾取物体。在图2(a)中,中间的圆角矩形被拾取,在图2(b)中,右边的圆球被拾取。

图2 Depth ray拾取示意图

3 三维地质体可视化系统中拾取算法实现

首先构建一个地层模型,地层显示的最小图元为三角图元。用户可以通过操作地层进行旋转平移操作,并且可以用普通鼠标进行拾取操作。拾取的单位可以是某个地层也可以是某个三角图元。当拾取某个特定的地层时,该地层用网格显示,其他地层被隐藏。当拾取三角图元时,被拾取的图元变为用红色显示。

传统射线法拾取精度较高,但是拾取的对象只能是所有与射线相交的对象中距离射线顶点最近的,在有些情况下要拾取被遮挡的物体,而传统射线法难以实现。Depth-ray方法则通过一个深度标记,可以拾取到与射线相交的所有物体,即使物体被遮挡,由于深度标记要沿着拾取射线移动,所以当与射线相交的物体在拾取射线方向的距离较远时会影响该方法的效率。本文根据传统射线法和Depth-ray方法,实现了一种扩展了的射线拾取法。其拾取算法思路是:拾取时,将空间中的对象与射线求交,把与射线相交的所有对象保存起来,用户可以在这些保存的对象中选择一个作为拾取的对象,这样既能保证精确度,又能比Depth-ray方法快。

本文方法实现步骤如下:

(1)鼠标点击触发拾取动作,把鼠标点的Windows窗口坐标转换为三维世界坐标。实现的关键代码为:

其中,worldx、worldy、worldz分别为世界坐标空间中鼠标点的X、Y、Z坐标。

(2)获取摄像机在世界坐标系中的坐标,由摄像机所在位置向鼠标点发射射线。

(3)把空间中的对象分别与射线求交,并将相交对象的相关信息保存到栈中。保存的信息包括:对象ID、交点坐标、交点与摄像机的距离。

(4)将栈中的对象按照距离由小到大的顺序排列。用户可以根据需要在栈中切换拾取对象,切换的顺序按照交点与摄像机的距离从小到大排列。

拾取过程中,与射线相交的对象用蓝色标记,被拾取的对象用红色标记,拾取的点用绿色标记。在本实验中,单击鼠标左键拾取,点击键盘“Z”键在栈中切换拾取对象。

程序运行效果如图3及图4所示。图4表示用户选择的拾取对象,拾取时,与射线相交的对象(图中为三角面片)全部标记,其中被拾取的对象用红色标记,其余的用蓝色标记。

本文在三维地质体可视化系统中,把传统射线法和Depth-ray方法相结合,实现了一种扩展了的射线拾取法,既能够拾取被遮挡的物体,又能够保证精确度和速度,在系统应用中取得了良好的应用效果。

图3 显示地层

图4 拾取与射线相交的对象

[1]BOLT R A.“Put-that-there”: voice and gesture at thegraphics interface[J].Computer Graphics (SIGGRAPH′80 Proceedings), 1980, 14(3): 262-270.

[2]姚继权,李晓豁.计算机图形学人机交互中三维拾取方法的研究[J].工程设计学报,2006,13(2):116-120.

[3]VANACKEN L, GROSSMAN T, CONINX K.Multimodal selection techniquesfordense and occluded 3D virtual environments[J].International Journal of Human-Computer Studies, 2009, 67(3): 237-255.

[4]朱明亮,董冰,王祎,等.三维场景中基于视口空间的拾取算法[J].工程图学学报,2008(2):94-97.

[5]王亚平,余柯,罗堃.在OpenGL中一种新的拾取方法及其应用——基于对象缓冲区的选择拾取方法[J].工程图学学报,2003(2):60-64.

[6]VANACKEN L, GROSSMAN T, GROSSMAN T.Exploring the effects of environment density and target visibility on objectselection in 3D virtualenvironments [M].IEEE Symposium on 3D User Interfaces, 2007:116-12.

猜你喜欢

图元鼠标射线
“直线、射线、线段”检测题
学术出版物插图的编排要求(一):图注
联锁表自动生成软件的设计与实现
『直线、射线、线段』检测题
赤石脂X-射线衍射指纹图谱
γ射线辐照改性聚丙烯的流变性能研究
电气CAD接线图快速转换G图形的技术应用研究
鼠标折叠笔
数控车床的工艺与编程
45岁的鼠标