分享
 
 
 

建立EAI方式与SAI方式之间的通信

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

建立EAI方式与SAI方式之间的通信

解决JAVA控制VRML场景的一个实际问题

侯光敏 (wearebug[url=mailto:guangmin001@263.net]@etang.com)

2002 年 1 月

搞过java语言对vrml场景控制的人都知道,目前有两种方式对vrml场景进行控制,那就是EAI方式和SAI方式.EAI的全称是External Authoring Interface ,使用这种控制方式可以在applet中一目了然地输入各种参数来改变场景的内容,控制是非常灵活的.SAI方式,它不需要有applet的存在,只要为场景中的物体写相应的脚本代码即可,使用它可以实现许多VRML规范不能提供的复杂逻辑显示.两者可以说是各有所长,但是我在写一个控制VRML场景的程序时遇到了问题.

我在场景中放入了一组芯片模型,我想要达到的目的是,点击场景中的某芯片或某芯片的某管脚时,能在applet中显示芯片的内部结构图或者管脚的名称和电平状态,我必须要使用这些信息来改变相应的模型参数.但是单纯的SAI方式不能和applet通信,点击的结果不能被applet感知.而单纯的EAI方式也解决不了这个问题,因为要控制场景中的某个模型,必须先得到那个模型的名字.但在这种情况下模型的名称不可能被事先指定,它必须随着鼠标选择的变化而变化.要解决这个问题,必须在EAI方式控制和SAI控制之间建立起沟通信息的途径.

在查阅了VRML规范之后,我发现VRML规范中提供了一种供用户扩展的节点类型PROTO,由此我想出了解决这个问题的办法.其实这个办法很简单,就是用PROTO的各个自定义域来缓存需要通信的数据. 具体的做法是:在场景文件中定义一个名为Bridge的PROTO节点,为它增加一系列的域.在我这个具体问题中,我定义了SFString name,SFBool voltage两个域,还有SFSting型的pointA,pointB.然后为每个需要和applet通信的模型加入SAI方式的代码,单击事件(也可以是别的事件)触发一个过程,该过程把模型的名字写入Bridge的name域或pointA,pointB,把状态写入voltage域.

以下是VRML文件示例代码:

#the node that exchange data between SAI and EAI

PROTO Bridge [ exposedField SFString pointA "### ^-- ^"

exposedField SFString pointB "### ^ --^"

exposedField SFString name "null"

exposedField SFBool voltage FALSE

]{} //

DEF se Bridge{}

.......

DEF leg17 Transform {

translation 35.5 16.7 -203

rotation 0.577 0.577 -0.577 -4.19

children [

DEF leg17_touch TouchSensor {}

Shape {

appearance USE legcolor

geometry USE leg17-FACES

}

]

}

......

DEF leg17_S Script { //芯片第十七号管脚的节点

url "NodeScript.class"

eventIn SFBool leg17

field SFNode node USE leg17

field SFNode select USE se

}

.....

ROUTE leg17_touch.isActive TO leg17_S.leg17

.....

以下是节点的脚本代码片断:

public class NodeScript extends Script

{

private SFNode theSelected;

private SFString selectedA,selectedB;

Browser br;

public void initialize()

{

theSelected=(SFNode)getField("select");

br=getBrowser();

}

public void processEvent(Event e)

{ ConstSFBool v=(ConstSFBool)e.getValue();

Node selected=(Node)theSelected.getValue();

//**获得交换节点的域

selectedA=(SFString)selected.getExposedField("pointA");

selectedB=(SFString)selected.getExposedField("pointB");

//*/

br.setDescription(e.getName()); //在浏览器底部显示节点名

//在此有改动,不使用开关值,改用队列先进先出写值 2001/11/30

if(v.getValue())

{ selectedB.setValue(selectedA.getValue());//b-->a

selectedA.setValue(e.getName()); // newValue-->b

}

}

}

然后在EAI方式的代码中为applet加入一个线程,它无限循环的读Bridge节点的各个域值然后显示出来,完成了数据从SAI向EAI的传递,就这么简单.以下是示例代码:

public class displayPanel extends Panel implements Runnable

{ public static Label label1 = new Label();

public static Label label2 = new Label();

Browser br;

.......

public void run()

{

while(true) //循环监听点击情况

{ swich=VrmlObject.getSwichName(br);

voltage=VrmlObject.getSwichVoltage(br);

displayPanel.label1.setText(VrmlObject.getNodeA(br));//VrmlObject类封装了对节点的访问

displayPanel.label2.setText(VrmlObject.getNodeB(br));

}

}

}

使用这种方式,你可以扩充Bridge的域来缓存各种VRML规范所规定的数据类型.

关于作者

侯光敏:天津理工学院计算机科学与工程系大四学生,正在研究用java和vrml实现多用户协同的虚拟实验室的项目.欢迎和我联系:[url=mailto:wearebug@etang.com]wearebug[url=mailto:guangmin001@263.net]@etang.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有