Graphics 版 (精华区)
发信人: leonado (##小:妖:发:呆:勒##), 信区: Graphics
标 题: 虚拟现实之高级技巧(十)
发信站: 哈工大紫丁香 (2001年01月07日19:26:58 星期天), 转信
DEF DOOR_SCRIPT Script{
url "AutomaticDoor.class"
# light control
eventIn SFTime touched
eventOut SFBool turnOnLight
# door control
eventIn SFTime enterArea
eventOut SFTime openDoor
eventIn SFTime exitArea
eventOut SFTime closeDoor
}
ROUTE LIGHT_ON_SWITCH.touchTime TO DOOR_SCRIPT.touched
ROUTE DOOR_SCRIPT.turnOnLight TO LIGHT1.on
ROUTE DOOR_SCRIPT.turnOnLight TO LIGHT2.on
ROUTE PROX_SENSOR.enterTime TO DOOR_SCRIPT.enterArea
ROUTE DOOR_SCRIPT.openDoor TO DOOR_OPEN_TIME.set_startTime
ROUTE DOOR_OPEN_TIME.fraction_changed TO DOOR_OPEN_INTP.set_fraction
ROUTE DOOR_OPEN_INTP.value_changed TO DOOR.set_translation
ROUTE PROX_SENSOR.exitTime TO DOOR_SCRIPT.exitArea
ROUTE DOOR_SCRIPT.closeDoor TO DOOR_CLOSE_TIME.set_startTime
ROUTE DOOR_CLOSE_TIME.fraction_changed TO DOOR_CLOSE_INTP.set_fraction
ROUTE DOOR_CLOSE_INTP.value_changed TO DOOR.set_translation
JAVA程序部分:
// toggle the light state.
// control the automatic door.
import vrml.*;
import vrml.node.*;
import vrml.field.*;
public class AutomaticDoor extends Script{
SFBool turnOnLight;
SFTime openDoor;
SFTime closeDoor;
// light state.
boolean onOff = false;
public void initialize(){
// get the reference of the event out "turnOnLight".
turnOnLight = (SFBool)getEventOut("turnOnLight");
// get the reference of the event out "openDoor".
openDoor = (SFTime)getEventOut("openDoor");
// get the reference of the event out "closeDoor".
closeDoor = (SFTime)getEventOut("closeDoor");
}
public void processEvent(Event e){
if(e.getName().equals("touched") == true){
// toggle the light state.
onOff = !onOff;
// send the event.
turnOnLight.setValue(onOff);
}else if(e.getName().equals("enterArea") == true){
if(true == onOff){
// open the door if the light is on.
openDoor.setValue(((ConstSFTime)e.getValue()).getValue());
}
}else if(e.getName().equals("exitArea") == true){
// close the door.
closeDoor.setValue(((ConstSFTime)e.getValue()).getValue());
}
}
}
这段程序比较长,讨论的是一个用户在虚拟城市中,走到一个商店前,商店门自动
打开,用户进入商店的内容,但在用户进入商店之前,要进行一个时间判断,当用户在
容许的时间段内,门上的灯将点亮,用户可以进入商店,如果在容许的时间段外,门上
的灯将熄灭,就算用户走近门,商店门也不会打开。这段程序中构建了一个商店,两个
灯和自动门这些实体,路线分为三个部分,一个是设置灯的,使script可以控制灯的开
关并记录当前的状态。第二部分是设置开门的路线,第三部分设置关门的路线。当用户
进入ProximitySensor结点的size定义的区域后,发送一个enterTime事件,命名为DOOR
_SCRIPT.ProximitySensor。Java程序判断灯的状态,如果灯亮,开始TimeSensor并返回
当前时间给Script结点,Script结点驱动DOOR_OPEN_INIP插入器开门,如果灯为灭,那
么就没有TimeSensor返回事件。当用户离开门附近时,传感器发送一个exitTime给Scri
pt结点,这时同样的Java程序返回一个当前时间给Script,然后Script结点又驱动DOOR
_CLOSE_INIP插入器关门。
在构建你的场景时一定要仔细考察实现中的情况,同时灵活运用VRML与Java结合。
--
美女说:“小妖,你很可爱丫...”
小妖刚要把那段“我已经尽可能的掩饰我的锋芒,奈何还是被慧眼人看出”云云背出来...
美女却扬长而去...>Q<
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.230.141]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.237毫秒