编辑:sx_zhangjh
2014-06-05
浅谈Java3D鼠标交互功能的扩展与应用
1 引言
Java3D是Java语言在三维图形领域的扩展,利用Java3D提供的API,可以编写出三维动画、三维游戏等等。Java3D本身已经提供了一些鼠标交互功能,可以根据用户的操作进行实时的场景变换?。但是现有的交互手段还比较有限,通常需要进行扩展。邓文O A生、马王俊美在参考文献【1】中提出并实现了使用鼠标点取同一区域上的多个目标物体并自由选择具体操作对象的方案,Fabio.R.Mirand等人开发的VMMV系统【z】能够使用弹出式菜单完成对目标对象的操作。然而,在实际应用中特别是在虚拟环境中存在大量物体的情况下,用户不仅面临着在纵向(垂直于显示屏幕)上相同区域存在多个重叠物体时产生的拾取不到的问题,而且面临着在横向平面(平行于显示屏幕)上由于多个物体距离较近带来拾取误差而产生的拾取不准的问题。这里提出了一种应对方法,即在用户发生点取操作之前提示用户将要选中的对象是哪个,方便了用户的拾取操作。
2 拾取提示功能的总体思路和具体实现
2.1拾取不准问题的产生与应对方法如图1是对相邻的几个小立方体进行拾取的实验。小立方体被选中后会变成绿色,用户希望选中右上角的小立方体,点击鼠标之后选中的却是相邻的另一个小立方体。这个问题是由Java3D的拾取误差导致的。在Java3D中拾取是这样一个过程:发生点击事件的时建立一条连接空间中的视点和鼠标在投影平面上的点击点的拾取射线并按需要返回与射线相交的可点取对象【3】。系统建立拾取射线时需要连接视点和鼠标点击点,视点的坐标是基于虚拟世界中原点的三维坐标,而从系统中获得的鼠标指针坐标是基于窗口右上角的AV 事件坐标,两个坐标处于不同的坐标系,这就需要把鼠标指针基于屏幕右上角的坐标转化为基于虚拟世界中原点的坐标,在这个坐标系转换中会不可避免地产生视觉上的误差和数值上的误差,于是带来了用户拾取不准的问题。
应对方法是通过对预选对象进行提示避免用户选取出错的问题。具体来说就是:以鼠标移动事件作为激励信号(此时用户尚未发生点取操作)创建一条连接空间中的视点与投影平面上的鼠标点的判定射线,返回距离视点最近的可点取对象所在的节点。然后向该节点上添加一个动画效果以提示用户该对象为预选对象。以上过程如图2。
2.2鼠标交互功能扩展的实现原理Java3D提供的主要鼠标交互功能如表1。已有的交互类均设置了MouseCallBack或者Picking-Callback为回调接口,为的是更新场景的位置、角度和尺度(即场景的Transform3D对象,因为位置、角度、尺度信息均包含在Transform3D对象中)。这里提出的方法是在鼠标的移动过程中对鼠标指针与虚拟场景中物体的位置关系进行实时的判断,需要对鼠标移动事件进行处理,但是与原有的鼠标交互类不同的是该方法不需要更新场景的位置、角度、尺度等信息,即无需设置MouseCallBack或者Pick.ngCalIback为回调接口,所以选择了对Behavior类直接进行扩展,扩展后的类关系如图3。
2.3拾取提示功能的具体实现方法Behavior类是一个抽象类,对它进行扩展主要工作就是指定激励条件和编写针对该激励的反应函数。
具体来说就是指定鼠标的移动事件为激励条件编写鼠标移动事件的处理函数并建立判定射线,在满足条件的节点上添加提示效果。
2.3.1设置激励处理函数的唤醒条件initialize方法允许Behavior对象初始化其内部状态和指定其唤醒条件【3】。包含Behavior对象的节点被创建的时候, initialize方法被调用。在initialize方法中需要指定唤醒条件,否则激励事件的处理方法即processStimulus方法不会被执行。Java3D鼠标交互功能的扩展与应用,本方法以鼠标的移动事件作为激励,所以在initialize方法中给出唤醒条件为鼠标移动即MouseEvent.MouseMoved代码如下:
标签:JAVA论文
精品学习网(51edu.com)在建设过程中引用了互联网上的一些信息资源并对有明确来源的信息注明了出处,版权归原作者及原网站所有,如果您对本站信息资源版权的归属问题存有异议,请您致信qinquan#51edu.com(将#换成@),我们会立即做出答复并及时解决。如果您认为本站有侵犯您权益的行为,请通知我们,我们一定根据实际情况及时处理。