动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   网页设计 → 阅读文章

 虚拟现实之高级技巧(二)

作者来源: 
阅读 数 206 人次 , 2006-4-18 15:09:00 


  ≡谏弦黄颐墙樯芰藄cript结点与Java程序之间的结合情况,在这一篇中我们和大家谈谈如何通过Java程序控制几个为场景产生交互的主要结点,以及它们是如何通过script结点来传递和接收程序运行结果的。

  如果细心的读者应该看到了,在上一篇文章中的交互的变化球体的颜色例子中,我们用到了一个TouchSensor结点,大家都知道这个节点是捕捉鼠标的移动并且响应鼠标事件的,在上一个例子中,我们通过IsAction字段来判断TouchSensor的状态,单击鼠标球体变色,这是一个不连续的事件,但是大家千万不要以为TouchSensor只能产生不连续事件的响应。它能够响应鼠标的所有事件,当鼠标移动时hitNormal_changed、hitPoint_changed、hitTexCoord_changed等事件将产生,具体来说,我们可以通过TouchSensor的IsOver来判断时候鼠标在物体上,HitPoint又可以记录鼠标在物体上的具体座标,HitTexCoord用来记录座标结构,也就是说是坐标系的类型,HitNormal用来记录表面矢量,就是用来记录方向。使用这几个事件与Java程序结合,我们可以创造很多效果,比如说,在场景中用户用鼠标推动一个物体的运动。

  然而大多数的运用都是touchtime不连续事件,就是鼠标按下再松开时产生的事件,它激活一个timestamp时间事件,原来我们没有使用Java程序时,我们定制一段动画用鼠标来控制播放。就是场景中有一台电视,我们通过用鼠标按下开关,使电视开始播放一段动画,制作很简单,由于篇幅有限我们在这里只和大家讨论一下工作原理。先在场景中预设一段动画,设置从StartTime开始,到StopTime结束。StartTime事件由鼠标touchtime的touchtime事件触发,所以当鼠标按下开关,电视开始播放动画。但是这种通过TimeSensor和插入器实现简单动画有着很大的局限性,就是用户与场景的互动已经被固定在原先设定好了的路径上面,自然的这里我们又需要使用Java。
  由于没有使用Java前,场景中的运动是已经预定好了的,这里我们就举一个问题随机运动的例子。

VRML V2.0 utf8
DEF AGENT_TIME TimeSensor {
loop TRUE
cycleInterval 0.1
}
DEF AGENT_Transform {
children [
Inline{url"移动物体.wrl"}
]
}
DEF AGENT_SCRIPT script{
url"FloatingAgent.class"
eventIn SFTime interval
eventOut SFVec3f setAgentPosition
}
ROUTE AGENT_TIME.cycleTime TO AGENT_SCRIPT.i rval
ROUTE AGENT_SCRIPT.setAgentPosition TO AGENT.set_translation
Java程序代码如下:
import java.util.*;
import vrml.*;
import vrml.node.*;
import vrml.filed.*;
pubilc class FloatingAgent extends Script{
SFVec3f setAgentPosition;
float agentPosition[]=new Random();
public void initialize(){
setAgentPoisition=(SFVec3f)getEventOut("setAgentPosition");
AgentPosition[0]=0.0f;
AgentPosition[1]=0.0f;
AgentPosition[2]=0.0f;
}
public void processEvent(Event e){
if(e.getName().equals("interval")==true){
moveAgent();
}
}
float generateRadomFloat(){
return(randomNumGenerator.nextFloat()*0.2f-0.1f);
}
void moveAgent(){
agentPosition[0]+=generateRandomFloat();
agentPosition[1]+=generateRandomFloat();
agentPosition[2]+=generateRandomFloat();
setAgentPosition.setValue(agentPosition);
}
}

  现在我们来分析一下这个场景,我们首先有一个随机运动的物体,包括在移动物体.wrl文件中,我们在场景中从这个文件中调用物体,这样运动就与物体无关。在场景的VRML文件中,一个TimeSensor每隔0.1秒就收发可以agent_script的Script结点,由于开始和结束的时间都默认为0,且循环为真,所以计数器就可以不间断的运行,每隔一秒就产生一个包括当前时间的cycleTime值,被发送到Script结点中,相关的Java程序使用这一事件去随机移动包括代表物体几何图形的Transform结点,使物体最终产生随机的运动。接下来我们在看看Java程序是怎样工作的。在event-handler类,我们使用了intialize()方法,产生一个Script结点的setAgentPosition字段,我们通过计算这个字段,用来接收代理的新位置。在ProcessEvent()方法中,调用了moveAgent(),它产生-0.1到0.1随机数的generateRandomFloat。这个随机数用Java.util包括的RandomNumGenerator类产生。

  在这个例子中,使用Java程序实现了用VRML描述无法实现的功能,其实我们只是给出了Java与TimeSensor的一个很简单的例子,其实还有旋转,我们也是在event-handler类中实现,使用SetRouingParameters的方法,决定旋转轴同时可以建立定向注释。非连续一次性动作,比如说我们可以定义TimeSensor的loop字段为假,CycleInterval字段为5秒,这样传感器被激活时只在一个周期有效,如此等等。请大家注意的一个地方,在实际场景的设计中,往往许多可以通过使用VRML描述的变化行为,我们却往往使用Java程序,有人认为这时却用程序的方法是画蛇添足,其实道理行简单,Java程序是独立于物体存在的,编写一次可以被不同的物体运用。

  这一篇中,我们主要讨论了TimeSensor结点的情况,如果说TouchSensor与Java程序结合产生了互动,那么TimeSensor与Java程序结合就产生了互动的结果。在下一篇中,我们将和大家讨论通过Sound和AudioClip结点产生随机点唱,以及如何确定用户在场景中的位置等。   
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:到底什么是Web2.0 - Web2.0学习指南
· 下一篇:Yahoo的WEB标准里程
· 表格边框魔鬼教程
· 认识FrontPage 2002扩充插件之五
· 按颜色分类:黑色和白色(Black & White)
· C#事件机制归纳(上)
· 网页配色之黄金分割法


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077