编辑:
2014-06-05
public void initialize(){this.wakeupOn(newWakeupOnAWTEvent(MouseEvent.MOUSE—MOVED));}
2.3.2处理鼠标移动事件与添加动画节点激励处理函数即processStimulus完成了该方法的核心工作。它接收并处理Behavior的激励信息并执行响应函数,建立新的唤醒条件,最后退出该方法【4】。
按照建立射线,返回相交物体所在的节点的总体思路,这个方法被设计为主要完成三部分工作:
① 激励事件的接收,即获取鼠标移动事件。
② 激励事件的响应,即建立射线,返回距视点最近且与射线相交的对象所在的TransformGroup并在对这个节点下添加一个动画效果证明该节点是预选节点。
③ 建立新的唤醒条件,即下一次鼠标移动的时候再次触发这个处理过程。
为了获取鼠标指针的坐标,首先要获取鼠标事件。
当有输入事件发生时激励响应函数processStimulus会自动记录这些事件并存入一个叫criteria的枚举类型变量中【s1。要从中得到鼠标事件需要进行一系列的转换,转换过程如图4。首先从枚举类型中得到一个对象将其转化成WakeupOnAWTEvent类型并赋值给该类型的对象,调用该对象的getAWTEvent0方法返回包含一连串AWT事件的数组,最后从数组中取出第一个元素赋值给鼠标事件对象,至此获取鼠标移动事件的工作完成。
得到本次鼠标事件后既可以得到鼠标的坐标,建立判定射线,返回符合条件的节点。实现这样的功能需要建立一个拾取对象并调用它的pickNode(SceneGraphPath sgPath,int node—type)方法,该方法根据节点类型node—type中指定的类型得到一个可点取的节点对象的引用【sJ。本方法需要获取被选中物体所在的TransformGroup 所以类型指定为PickObject.TRANSFORM—GROUP。pickNode方法的第一个参数使用PickObject的另一个方法pick—Closest(int xpos,int ypos)的返回值传入,该方法以视点为起点建立一条从视点出发以沿鼠标坐标方向的射线并返回距视点最近的可拾取物体,其中鼠标指针坐标xpos和ypos从之前获得的鼠标事件对象中获得。最后把pickNode方法返回的值强制转化成TransfromGroup类型并在该节点下添加一个动画效果表明这个物体是预选物体。最后在程序的末尾指定新的激励条件为鼠标移动事件。
3 在三维数独游戏中实际应用的效果
三维数独游戏是一种填数字游戏,由9 9 9个小立方体组成,在每个小立方体中填入数字并保证在X,Y,Z三个方向上的每列中均没有相同的数值,同时保证每宫中的数值不能相同。其三维布局如图5。由于要在每个立方体中填入数字而且立方体距离较近,所以不可避免地出现用户点取不便的现象。使用上述的解决方法,用户把鼠标指针移动到某个可点取的小立方体时该立方体显示一个渐变的动画效果告知用户哪个小立方体会将会被选中,方便了用户的操作。
如图6是被放大的三维数独Z轴方向上9个平面中的一个平面。未被选中的立方体为白色半透明状,被选中的立方体变成绿色,用户单击下方的数字按钮可以向绿色的立方体中填入对应的数字。用户移动鼠标到另外一个位置时鼠标指针对应的预选立方体表现为不断变化的半透明蓝色,若用户此时点击鼠标则该蓝色立方体将被选中变成绿色,与此同时原来的绿色立方体变回白色半透明装。实际操作中这种方法可以方便用户进行拾取,提高拾取的正确率。
4 结语
分析了Java3 D现有鼠标交互功能,在此基础上对虚拟场景中鼠标的交互功能做出了扩展,提出了一种能够在用户发生点取操作之前提示用户哪个物体将被选中的方法并给出了实现过程。在三维数独程序中的应用证明这种方法提高了用户同场景交互的灵活性,方便了用户的拾取操作,有一定的参考价值。但是,这种方法没有从根本上解决Java3 D 产生拾取误差的问题,未来研究工作的重点是对Java3 D 的拾取机制进行进一步的研究,从根本上减少误差的产生。
相关推荐
标签:JAVA论文
精品学习网(51edu.com)在建设过程中引用了互联网上的一些信息资源并对有明确来源的信息注明了出处,版权归原作者及原网站所有,如果您对本站信息资源版权的归属问题存有异议,请您致信qinquan#51edu.com(将#换成@),我们会立即做出答复并及时解决。如果您认为本站有侵犯您权益的行为,请通知我们,我们一定根据实际情况及时处理。