Graphics 版 (精华区)
发信人: leonado (##小:妖:发:呆:勒##), 信区: Graphics
标 题: 虚拟现实之高级技巧(四)
发信站: 哈工大紫丁香 (2001年01月07日19:20:48 星期天), 转信
下面我们来谈谈VRML类型与Java类映射的问题,其实所有的VRML类型都有一个相关
的Java类,有很多大家可以到http://vag.vrml.org看看。我们在这里只是介绍script结
点的字段,Field getfield(string fieldName)这个调用返回fieldName的Script结点字
段的参考值,这个参考值可以转换为相应的Java类。Field geteventOut(string event
Name)这个调用返回给eventOutfield事件输出字段一个参考值,并能映射到正确的Java
类。Field geteventIn(string eventName)返回一个事件输入字段的参考值。当从VRML
场景中输入的数据被程序处理完毕之后,程序需要将结果回写到场景的结点中,字段使
用下面的方法,getSize()返回MF字段的一些元素。getValue()把VRML值转换成Java值并
返回,get1 Value(int index)和getvalue()功能一样,但在MF字段的索引处得到值。s
etValue(value)将VRML字段放置到Java值。set1Value(int index,value)和setValue()
功能一样,但在MF字段的索引处得到值。addValue(value)把一个新值加到MF字段的尾部
,因此加入了一个新元素。insetValue(int index,value)在MF字段中用值插入一个新元
素。deletValue(int index)从MF字段中的删除索引注解元素。clearValue()删除MF字段
的所有元素。
讲了这么多,下面我们来举个例子看看VRML场景与Java程序之间到底是如何工作的。这
个例子我们在VRML结点指南中曾经谈过,有一个红球,用鼠标点击后变为蓝色,当时我
们是使用静态的方法,无法记录场景的当前情况,所以当球变为蓝色后,再点击鼠标已
经没有变化。在这里我们就使用动态的方法,当球变为蓝色后,点击鼠标球又变为红色
,依此类推球不断改变颜色。
#VRML V2.0 utf8
Transform {
children [
DEF TS TouchSensor { }
Shape {
appearance Appearance {
material DEF SphereColor Material {
diffuseColor -1 0 0 }
}
geometry Sphere{ }
}
]
}
DEF ColorScript Script {
url "ChangeColor.class"
eventIn SFBool clicked
eventOut SFColor newColor
field SFBool on FALSE20 }
ROUTE TS.isActive TO ColorScript.clicked
ROUTE ColorScript.newColor TO sphereColor.set-diffuseColor
Java程序代码
import vrml.*;
import vrml.field.*;
import vrml.node.*;
public class ChangedColor extends Script {
private SFBool on;
private SFColor newColor;
float red[]={1,0,0};
float blue[]={0,0,1};
public void initialize(){
newColor=(SFColor) getEvenOut("newColor")
on=(SFBool)getField("on")
}
public void processEvent(Event e) {
ConstSFBool v=(ConstSFBool)e.getValue();
if(v.getValue()){
if(on.getValue()){
newColor.setValue(red);
} else {
newColor.setValue(blue);
}
on.setValue(! on.getValue());
}
}
}
下面我们来解释一下这个程序,Java程序从字段中读取球体颜色,它用一个布尔值
来表示,false为红色,ture为蓝色。注意initialize()方法的使用,当浏览器在VRML
script结点和包含event-handler类的Java程序之间建立映射时它被调用,在这里用来建
立一个SFColor类的newColor。在程序中代码通过on.getValue()得到当前颜色情况,通
过setValue()进行颜色设置,最后newColor字段是一个eventOut字段,写入script结点
后做为一个事件被传送到shape的material字段。
在就是一个典型的VRML与Java结合的例子,在下一篇中我们将向大家介绍Java程序
与其它的结点结合运用的情况。
--
美女说:“小妖,你很可爱丫...”
小妖刚要把那段“我已经尽可能的掩饰我的锋芒,奈何还是被慧眼人看出”云云背出来...
美女却扬长而去...>Q<
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.230.141]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.304毫秒