浅谈Java3D鼠标交互功能的扩展与应用_0.docVIP

浅谈Java3D鼠标交互功能的扩展与应用_0.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Java3D鼠标交互功能的扩展与应用_0

浅谈Java3D鼠标交互功能的扩展与应用 浅谈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代码如下: public void initialize(){this.wakeupOn(newWakeupOnAWTEvent(MouseEvent.MOUSE-MOVED));} 2.3.2处理鼠标移动事件与添加动画节点激励处理函数即processStimulus完成了该方法的核心工作。它接收并处理Behavior的激励信息并执行响应函数,建立新的唤醒条件,最后退出该方法【4】。 按照建立射线,返回相交物体所在的节点的总体思路,这个方法

文档评论(0)

专注于电脑软件的下载与安装,各种疑难问题的解决,office办公软件的咨询,文档格式转换,音视频下载等等,欢迎各位咨询!

1亿VIP精品文档

相关文档