📄 第二十二章 创建程序脚本.txt
字号:
第二十二章 创建程序脚本
在VRML中还给出了功能更为强大的空间控制节点Script节点。Script节点利用Java或者Javascript语言编写的程序脚本来扩展VRML的功能,换句话说就是通过Script节点可以创建出新的内插和传感节点来驱动和控制整个虚拟空间。
1、Script节点语法
Script {
url [] #域值类型 MFString
mustEvaluate FALSE #域值类型 SFBool
directOutput FALSE #域值类型 SFBool
#Any number of
field fieldType fidldName initialValue
eventIn eventlnType eventInName
eventOut eventOutType eventOutName
}
url域值指定了一个被按优先级区分的URL列表,它是按高优先权到低优先权排列的。一般情况下,VRML浏览器先打开此列表中第1个由URL指定的文件。如果这个文件没有找到,浏览器就会继续打开列表中第2个URL指定的文件,依此类推。当找到了URL并将其打开后,文件中的程序脚本就会被读下并用来定义Script节点的动作。如果没有任何一个URL能够被找开,那么程序脚本就不会被读入,Script节点也就没有任何动作。
url域中的URL值指定的程序脚本可以是由任何VRML浏览器支持的语言写成。通常情况下浏览器支持的语言有Java语言和JavaScript语言。
JavaScript的函数和指令可以直接包含于url域中,从而代替以往那种通过以“JavaScript”为URL值的开始从而将分立的文件关联起来的做法。URL的其余部分被当作JavaScript语言文本,它们被浏览器的JavaScript语言解释器解释。JavaScript中凡是包含字符串或正篇文本的地方都应该用单一的引用语标记,这样可以避免由URL值末尾的两个引用语标记引起的混乱。
mustEvaluate域可以通过设为TRUE或FALSE来指定程序脚本是如何进行求值的。为此域值为TRUE时,每当由节点的eventIn事件接收到一个新值后,浏览器立即对程序脚本进行计算。当此域值为FALSE时,程序脚本的计算就有可能被浏览器推迟,直到合适的时间到来。这样会产生事件到节点的传送和计算节点处理该事件动作的延迟。当计算被延迟时,如果多个事件被递交到节点,那么待处理事件的列表就会变长。在通常情况下,程序脚本将mustEvaluate域值设定为FALSE。
★使用技巧:为了尽量使性能达到最佳,mustEvaluate域值应被设定为FALSE。浏览器的性能部分取决于一个事件发出后必须被进行计算的程序脚本数目。如果将mustEvaluate域设为TRUE就会增加浏览器的工作量,从而降低画面的刷新速度和交互性。
directOutput域可以通过设定为TRUE或FALSE来说明程序脚本的输出是否受到限制。当域值为FALSE时,程序脚本就可以读取任何节点的可见域和eventOut事件的值(如向Script节点域或eventIn事件发送一个值)。当directOutput域值为TRUE时,程序脚本可以对任何节点的可见域进行写操作,或对任何节点的evevtIn事件送值。另外,当directOutput域值为TRUE时,程序脚本还可以在空间中增加或删除一条通路。通常情况下,程序脚本将directOutput域值设定为FALSE。
★使用技巧:为了尽量使系统达到最佳性能,directOutput域值应被设定为FALSE。浏览器的性能取决于其在虚拟空间中优化内部造型结构的能力。如果把directOutput域设定为TRUE就会减少浏览器对其内部进行优化的余地。这样就会增加浏览器的工作量,从而降低画面的刷新速度和交互性。
通过向url可见域的隐含set_url的eventIn事件发送值就可以改变URL列表。当从输入接收了一个值时,相应的域值就会被改变,新值会由可见域的隐含url_changed的eventOut事件输出。当Script节点的URL列表变化时,当前的程序脚本会被中止。新的程序脚本就会被调入和初始化。
Script节点的field,eventIn和eventOut的语法分别定义了由url域值显示的在Script节点与程序脚本间的接口。Field的语法定义了一个带有数据类型的接口域,一个接口域名和一个初始化值。有效的数据类型参见第2章。
Script节点的eventIn语法定义了一个包含数据类型的eventIn接口和eventIn接口名。接口域、eventIn事件和eventOut事件的名字在节点的内部必须是唯一的。
程序脚本在3种情况下与脚本节点相联系:初始化、程序中止和事件接收。程序的中止,通常发生在一个虚拟空间被另外一个更新的虚拟空间替换后。还发生在包含程序脚本的Script节点的世界被清除或是当Script节点的url域被改变时。事件接收发生在Script节点通过一个evevtIn事件接收到一个值时。这种情况通常发生在一个值通过路由连接到eventIn事件接口时,或者发生在有着直接输出通道的另外一个编程脚本指定一个值到evevtIn事件接口时。
Script节点不创建任何造型,可以被作为子节点包含在任何组节点中,但它不依靠于所使用的系统,与子节点所作的选择无关,就像那些在Switch和LOD节点内创建的一样。Script节点一般放在VRML文件的最外层组。
[一个包含了简单的程序脚本的VRML文件.wrl]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -