虚拟现实之高级技巧(五)
2008-01-05 08:21:48 来源:WEB开发网核心提示:witch结点将使场景具有更多的灵活性和真实感,它的目的在于容许附加多个子结点,虚拟现实之高级技巧(五),并容许同时运行这些结点,当然也可以使用ToUChScense结点同时定义多条路线,接下来我们将与大家讨论访问权限设置,多线程的运用以及拓展结构等问题,但是这样会使程序非常繁杂,在多个外形变化时
witch结点将使场景具有更多的灵活性和真实感,它的目的在于容许附加多个子结点,并容许同时运行这些结点。当然也可以使用ToUChScense结点同时定义多条路线,但是这样会使程序非常繁杂,在多个外形变化时,几乎没有人使用这种方法。
在场景中有一个waiter,当用户接近点击他,waiter做出一个向用户问候的姿式。完成场景中这样一个设计,首先在三维软件中做出waiter的两个姿式,一个是用户没有点击时的姿式Detail保存为Detail.wrl,和一个waiter问候的姿式Hello保存为Hello.wrl。当然理论上Switch结点是支持无限任意姿式的,只需要你预先定义几种模型,让Switch结点选择在什么时候使用什么样的姿式就行了,只是在这个例子中,我们使用了两个姿式罢了。我们将两个姿式模型定义在一个Switch结点中,在用户点击之后,通过Script结点的setAgentImage字段传递给java程序,再由Java程序决定用什么姿式模型,然后再将选择的结果返回到Script结点的WhichChioce中,告之Switch结点要使用的模型显示出来。
#VRML V2.0 utf8
Transform{
children[
DEF AGENT_SWITCH Switch{
whichChoice 0
choice[
# normal posture
Inline{url "Detailed.wrl"},
# hello posture
Inline{url "Hello.wrl"}
]
},
DEF AGENT_TOUCH TouchSensor{}
]
}
DEF AGENT_SCRIPT Script{
url "SwitchAgent.class"
eventIn SFTime touchTime
eventOut SFInt32 setAgentImage
}
ROUTE AGENT_TOUCH.touchTime TO AGENT_SCRIPT.touchTime
ROUTE AGENT_SCRIPT.setAgentImage TO AGENT_SWITCH.set_whichChoice进入讨论组讨论。
判定使用姿式模型的Java程序:
import vrml.*;
import vrml.node.*;
import vrml.field.*;
public class SwitchAgent extends Script{
SFInt32 setAgentImage;
boolean normalPosture = true;
public void initialize(){
// get the reference of the event out "setAgentImage".
setAgentImage = (SFInt32)getEventOut("setAgentImage");
}
public void PRocessEvent(Event e){
if(e.getName().equals("touchTime") == true){
// toggle the state.
normalPosture = !normalPosture;
if(true == normalPosture){
// make the agent in normal posture.
setAgentImage.setV e(0);
}else{
// make the agent in hello posture.
setAgentImage.setValue(1);
}
}
}
}
接下来我们再和大家谈谈碰撞的问题,在VRML的场景中实体是默认为实心的,也就是说场景中的实体在默认状态下是需要进行碰撞检测不能被穿透的。在结点指南中我们和大家谈过是由Collision结点控制的,但是实际的情况中,并不是所有的实体都需要进行碰撞检测的,就需要对Children字段进行设置,它决定了碰撞检测的开关,具体的设置请大家看看结点指南,这里只和大家将一个方法。假如说场景中有一棵树,或者是更为复杂的几何图形,假如它的某一部分需要进行碰撞检测,那么浏览器进行非常复杂的碰撞检测将会大大的降低速度,同时设置也会很复杂。我们用一个简单的方法,将需要进行碰撞检测的部分通过Collision结点的Proxy字段与一个简单的几何图形联系起来,一旦用户与简单图形发生碰撞,那么原来需要进行碰撞检测的部分也跟着进行了碰撞检测,用简单图形替代了复杂图形的碰撞检测。同时还需要注重一点,当发生碰撞时,Collision结点产生一个CollisionTime事件,通过这个事件触发程序可以调用其它的事件。比如说场景中有一堵墙上面有"危房"二字,当用户与墙发生碰撞后,调用墙倒下的事件。谈到这里碰撞的检测设定已经非常简单了,大家可以先设置两堵墙一堵可以穿过,另一堵需要进行碰撞检测试试,至于复杂的场景这些都在于用户个自的设计了。
在下一篇中,我们将和大家讨论最后一个构造场景的问题,当场景很大时,设置几个点让用户可以在场景中进行跳越,用Viewpoint创造的如时空门的效果。接下来我们将与大家讨论访问权限设置,多线程的运用以及拓展结构等问题。进入讨论组讨论。
[]
更多精彩
赞助商链接