中国视频在线(www.chinavideoonline.com)致力于收集各种流媒体相关的技术资料,以及流媒体常识和应用方案,力求为广大朋友了解学习和使用流媒体技术提供帮助
VRMLscript
作者/来源:未知
VRMLScript是JavaScript的一个子集,支持VRML数据类型,有其他脚本语言不及的特性:
Script可以源代码,单独的URL形式引入。
直接支持VRML 2.0的所有数据类型。
使用单独的函数接收外部事件,可以简化开发过程,提高处理速度。
使用简单的赋值向外部发送事件。
在表达式中可直接使用标量数据(SFTime, SFInt32, SFFloat, SFBool)。JavaScript 数据对象可直接转换为此四种数据类型的任意一种。例如,你可用a = time + 3使SFTime变量增加3秒。
可使用构造器轻松创建与转换大多数的数据类型。
数据与字符串对象与全部JavaScript函数兼容。
全部JavaScript string 方法与属性可用。标量可自动转化为字符串。
--------------------------------------------------------------------------------
1 语言
VRMLScript与JavaScript具有相似的语法形式
1.1 BNF 语法
script :
functions
NULL
functions:
functions function
function
function:
function beginFunction ( args ) statementBlock
beginFunction:
identifier
args:
args , identifier
identifier
NULL
stmntblk:
{ statements }
{ }
statement
statements :
statements statement
statement
statement :
ifStatement
forStatement
whileStatement
returnStatement
breakStatement
continueStatement
compoundExpression
ifStatement :
if ( compoundExpression ) statementBlock
if ( compoundExpression ) statementBlock else statementBlock
forStatement :
for ( optionalExpression optionalExpression optionalExpression ) statementBlock
whileStatement :
while ( compoundExpression ) statementBlock
returnStatement :
return compoundExpression
return
breakStatement :
break
continueStatement :
continue
compoundExpression :
expression , compoundExpression
expression
optionalExpression:
compoundExpression
NULL
expression : ( compoundExpression )
- expression
! expression
~ expression
leftVariable = expression
leftVariable += expression
leftVariable -= expression
leftVariable *= expression
leftVariable /= expression
leftVariable %= expression
leftVariable &= expression
leftVariable |= expression
leftVariable ^= expression
leftVariable <<= expression
leftVariable >>= expression
leftVariable >>>= expression
++ expression
-- expression
expression ++
expression --
expression ? expression : expression
expression == expression
expression != expression
expression < expression
expression <= expression
expression >= expression
expression > expression
expression + expression
expression - expression
expression * expression
expression / expression
expression % expression
expression && expression
expression || expression
expression & expression
expression | expression
expression ^ expression
expression << expression
expression >> expression
expression >>> expression
string
number
objectMethodCall
objectMemberAccess
functionCall
new constructor
arrayDereference
variable
functionCall :
identifier ( params )
constructor :
identifier ( params )
objectMethodCall :
expression . identifier ( params )
objectMethodAccess :
expression . identifier
params :
params , expression
expression
NULL
arrayDereference :
expression [ compoundExpression ]
leftVariable :
objectMethodAccess
arrayDereference
variable
variable :
identifier
string:
\' utf8 \'
number:
0{0-7}+
... ANSI C floating point number ...
0X{ 0-9 }+
0x{ 0-9 }+
TRUE
true
FALSE
false
identifier:
utf8Character { utf8 }*
utf8Character:
... any legal UTF8 character except 0-9 ...
utf8:
utf8Character
0-9
1.2 对象与变量
数据在 VRMLScript 中被描述为对象。对象类型对应于VRML的域 。一个变量包含对象的一个状态,并且可预先定义 ( 在 Script 节点中 ) 或局部定义。
1.2.1 取值, 命名
一个VRMLScript变量保存对象的一个状态。如果一个Script节点的field或eventOut被定义 ,则与此同名的变量在 Script 节点中全程可用。这个变量的类型与field或eventOut的类型一致。( 见数据变换 ) 。
变量名必须以一个字母 (\"a\"—\"z\"或“A“—”z“), 或下划线”_\"开头。随后的字符可以是任何字母或数字。变量名是区分大小写的?
变量可通过给新的变量名赋值来创建。变量的类型总是最后被赋值的类型。变量在它被初次引入的程序块范围内有效,Script节点中的field或eventOuts变量在整个节点范围内有效。
数字, 布尔, 字符串类型的文字可在VRML Script中使用。数字类型可以是十进制 ( 417 ), 十六进制 ( 0x5C ), 或 八进制 ( 0177 ) 形式。也可为浮点 ( 1.76 ) 或指数 ( 2.7e-12 ) 形式。所有的数字字符均为 number 类型。布尔类型值为“true”或“false”类型为 boolean 。字符串可以是在单引号 (\') 中的任何顺序的 UTF8 字符,类型为 String。特殊字符可按下列方式使用
字符 含义
\\b 退格
\\f 换页
\\n 换行
\\r 回车
\\t tab
\\\' 单引号
\\\" 双引号
\\\\ \\
举例:
Script {
field SFFloat aField 0
field SFVec3f aVector 0 0 0
eventOut SFInt32 anEventOut
eventIn SFBool event
url \"vrmlscript:
function event(value, timestamp) {
if (aField == 1.5) {
a = true; // \'a\' contains a boolean
}
if (a) { // this is NOT the same \'a\' as above!
value = 5; // ERROR,
// can\'t assign to function parameter!
}
aField = anEventOut; // SFInt32 converted to SFFloat
b = aField; // \'b\' contains a number
b = anEventOut; // \'b\' now contains a different number
aField = aVector; // ERROR,
// can\'t assign SFVec3f to SFFloat!
s = \'Two\\nLines\'; // \'s\' contains a String
}\"
}
1.2.2 对象与域
field变量保存的值为函数最后一次调用它的值。EventOut变量与域变量很类似。不同的是当一项任务分配了eventOut变量时,一个事件产生。
每个对象有一套属性和方法(见对象和函数定义)。属性(使用\" .\" 操作符)用于表达式或表达式的对象。方法(使用函数调用操作符)用于在对象上执行某些操作?
举例:
function someFunction() {
a = new SFColor(0.5, 0.5, 0.5);
b = a.r; // \'b\' contains 0.5
a.setHSV(0.1, 0.1, 0.1); // \'a\' now contains new properties
}
值a.r对应于SFColor的红色属性。方法a.setHSV()将颜色设置为HSV色彩模式。
1.2.3 构造对象
每种类型对象有一个相应的构造函数。构造函数允许使用灵活的参数对要构造的对象进行初始化。MF对象实质上是0个以上相应的SF对象组成的数组。使用关键词 new 与给定的数据类型可创造相应的对象。例如:
a = new SFVec3f(0, 1, 0); // \'a\' has a SFVec3f containing 0, 1, 0
b = new MFFloat(1, 2, 3, 4) // \'b\' has a MFFloat containing 4 floats
1.2.4 数据变换
数据变换的规则在下列表格列出:
类型 规则
String 数字或布尔转换为String
使用 parseInt() 或 parseFloat() 可把 String 转换为 number
Number 与 boolean 类型 将一个标量表达式赋给一个标量类型的固定变量(field 或 eventOut)时,转换为固定变量的类型
矢量类型
SFVec2f
SFVec3f
SFRotation
SFColor 只能与相同的类型组合
引用产生标量类型的值
SFImage 只容许赋值 (\'=\') 和 选择(\'.\') 操作
只能赋值 SFImage 类型
SFNode 只容许赋值 (\'=\') 和 选择(\'.\') 操作
只能赋值 SFNode 类型
MF types
MFString
MFInt32
MFFloat
MFVec2f
MFVec3f
MFRotation
MFColor
MFNode 只能与相同的类型组合
引用 (myArray[3]) 产生相应的 SF 类型.
引用后的 SF 类型遵守的规则与普通的 SF 类型相同.
1.2.5 MF 对象
大多数SF对象在VRMLScript中有一相应的MF对象。一个MF对象实质是上一个对象数组, 数组的每个单元是相应的 SF 类型对象。所有的 MF 对象有一个length属性用于返回或设置MF对象中单元的个数。数组索引以 0 开头。如果 vecArray 是一个 MFVec3f 对象则 vecArray [ 0 ] 是数组中的第一个SFVec3f 对象。
1.3 语句
VRMLScript 语句与 C 语言语句相似 。一个语句可出现一个 if 或 for 声明后。多重语句,或复合语句, 必须被放在\"{\"与\"}\"之间 。所有语句必须以\";\"结束。
例子:
if (a < b)
c = d; // simple statement, c is local to the if statement
else { // compound statement, c is no longer defined here
e = f; // e is local to the else block
c = h + 1;
} // e is no longer defined here
1.3.1 条件语句
if 语句计算一个表达式,并选择2条语句之一。简单的if语句中,如果表达的值不是 0 ,则执行后面语句。if...else 语句中,如果表达式的结果是 0 ,则执行else后的语句。在if...else嵌套的语句中, else与最近的if匹配。花括号能被用来打破这一限制。
例子:
if (a < 0) // simple if statement
if (a == 0)
if (b > 5) // if...else statement
else // this else clause matches the \'if (b > 5)\' statement
if (a == 0) {
if (b > 5)
}
else // this else clause matches the \'if (a == 0)\' statement
statement
1.3.2 循环语句
循环语句包含3个表达式控制循环的执行 。循环语句在循环执行前执行它的第一个表达式。在每次循环前计算它的第二个表达式, 如果表达式值为 0 ,退出循环,执行其他语句。循环重复执行, 直到第二表达式计算到 0 ,或遇到一个 break 语句,循环被终止。在典型的应用中,第一表达式初始化循环记数器, 第二计算它, 第三个对它进行累加。
例子:
for (i = 0; i < 10; ++i)
statement
while 语句包含控制循环执行的一个单个的表达式,被循环的语句列在后面。在每次循环前计算表达式, 如果表达式值为 0 ,退出循环。否则它执行语句并且再测试表达式。循环重复执行,直到表达式计算到 0 ,或遇到一个 break 语句,循环被终止.
例子:
while (i < 10)
statement
1.3.3 表达式语句
在 VRMLScript 中任何有效的表达式都是一个语句 两个最普通的表达式是函数调用和赋值表达式 ( 看下面 ) 。
1.3.4 Return 语句
Return 语句可不考虑嵌套结构而从函数中直接返回。如果指定,它的表达式可将计算结果返回被调用的函数。
例子:
if (a == 0) {
d = 1;
return 5 + d;
}
1.3.5 Break 语句
break语句退出嵌套循环。执行跟在循环语句后的语句。
例子:
while (i < 0) {
if (q == 5)
break;
other statements
}
// execution commences here upon break.
1.3.6 Continue 语句
Continue 语句跳到循环语句的最后。执行在循环后的语句。在for语句中,第二表达式测试第三个表达式的值,看循环是否应该继续。在for...in语句中next单元被赋值且循环继续。在 while 语句中表达式被测试是否循环应该继续。
例子:
for a in colorArray {
if (a[0] > 0.5)
continue;
other statements
// loop commences here upon continue.
}
1.4 符号
表达式用操作符把变量,对象,常数和其他表达式的值相结合。
例子:
a = -b; // unary prefix operator
a = b++; // unary postfix operator
a = b + c; // binary operator
a = b ? c : d; // tertiary operator
a = b * c + d; // compound expression
// the product of b * c produces a value which
// is added to d
1.4.1 赋值操作符
表达式 = 表达式可把右边表达式的结果赋与左边的表达式。左表达式必须可以存储右边的变量。包括简单的标识符, 操作符,对象的成员,函数的返回值。
例子:
a = 5; // simple assignment
a[3] = 4; // subscripted assignment
foo()[2] = 3; // function returning an MFField
另外,二元表达式可使用缩写的方式:‘+=’,‘-=’‘*=’,‘/=’,‘%=’,‘&=’,‘|=’,‘^=’,\'<<=\',\'>>=\',‘>>>=’。
例子:
a += 5; // adds 5 to the value of a and assigns it to a
a[3] &= 0x0000FFFF; // performs bitwise-and of a[3] and 0x0000FFFF
// assigning result to a[3]
1.4.2 算术操作符
算术操作符包括负号 (“-”), 补集 (“~”), 递加 (“++\"), 递减 (”--“) 和操作符 (” +“, “ - ”, “ * ”, “ / ”, “ % ” ) 。负号和补集是前缀。递加和递减是前缀或后缀 。剩余是二元的。
例子:
5 + b
(c + 5) * 7
(-b / 4) % 6
(c & 0xFF) | 256
递增与递减操作符做前缀或后缀时会有不同的结果。
例子:
a = 5; // Value of \'a\' is 5
b = a++; // Value of \'b\' is 5, value of \'a\' is 6
c = ++b; // Value of \'c\' is 6, value of \'b\' is 6
1.4.3 位操作符
位操作符包括与 ( “&” ), 或 ( “ | ” ), 异或 ( “ ^” ), 左移 ( “ <<\'), 右移 (\">>\") 。这些都是二元操作符并且对任何标量类型有效。当他们被使用时,标量的值在操作前被转换为 SFInt32 ,运算后返回原来的表达式类型。当把他们用于 SFFloat 或 SFTime 时,可能发生 roundoff 错误。移动操作符左边指定操作数,右边指定移动位数。
例子:
a & 0x0FF // clears upper 24 bits of \'a\'
a >> 5 // shift \'a\' 5 bits to the right, sign extend
1.4.4 逻辑,比较操作符
逻辑表达式包括逻辑与(\'&&\'), 逻辑或(\'||\'), 逻辑非(\'!\'),比较操作 (\'<\', \'<=\', \'==\', \'!=\', \'>=\', \'>\')。每个表达式取值 0 (false) 或 1 (true)。常数 true, false, TRUE, 和 FALSE 都可使用。
例子:
a < 5
b > 0 && c > 1
!((a > 4) || (b < 6))
1.4.5 字符串操作符
所有的比较操作符可用来为词典排序的字符串作比较。另外操作符 + 和“ += ”能被用来连接两个字符串。任何标量与的一个字符串连接,则标量首先转换为一个字符串,然后施行连接。一个字符串要转换为标量类型可使用 parseInt () 与 parseFloat () 函数。
例子:
\'A one and \' + \'a two\' // result is \"A one and a two\"
\'The magic number is \' + 7 // result is \'The magic number is 7\'
a = 5; // \'a\' contains an SFTime
a += \'is correct\'; // \'a\' is now the String \'5 is correct\'
1.4.6 操作符优先级
相等优先级的操作顺序列在下面的表格中。使用“ ( ”与“ ) ”括起的操作首先被执行。
例子:
a = b + c * d; // c * d is evaluated first
a = (b + c) * d; // b + c is evaluated first
a = b * c / d; // b * c is evaluated first
// (\'*\' and \'/\' have equal precedence, evaluation
// order is left-to-right)
优先操作规则:
操作符类型 操作符 注释
逗号 ,
赋值 = += -= *= /= %=
<<= >>= >>>= &= ^= |= right-to-left
条件 ?: tertiary operator
逻辑或 ||
逻辑与 &&
位或 |
位异或 ^
位与 &
相等 == !=
比较 < <= > >=
位移动 << >> >>>
加/减 + -
乘/除 * / %
取反/累加 ! ~ - ++ -- unary operators
引用, 成员 () [] .
--------------------------------------------------------------------------------
2 Script 节点的 url 域支持的协议
脚本的 url 域可以引用包含 VRMLScript 的url代码:
Script { url \"http://foo.com/myScript.vs\" }
vrmlscript :协议允许脚本被如下嵌入::
Script { url \"vrmlscript: function foo() { ... }\" }
url 域可以这样引用一个远端的文件或嵌入的代码:
Script {
url [ \"http://foo.com/myScript.vs\",
\"vrmlscript: function foo() { ... }\" ]
}
2.1文件扩展名
VRMLScript 源代码的文件扩展名是 .vs
2.2MIME Type
VRMLScript 源代码的 MIME 类型如下定义:
application/x-vrmlscript
--------------------------------------------------------------------------------
3 处理 EventIn 事件
送到Script节点的事件被传递给相应的 VRMLScript 函数。在Script节点的 url 域指定Script,是必要的。函数的名字与 eventIn 一样,eventIn 事件的值value和事件的发生时间 timestamp 作为参数传递,( 看“参数传递和 EventIn 函数” ) 。如果在Script中没有定义相应的 VRMLScript 函数,则浏览器无法执行相应操作。
例如, 下列Script节点有一个eventIn 域其名字是start :
Script {
eventIn SFBool start
url \"vrmlscript: function start(value, timestamp) { ... }\"
}
在上面的例子中,当start eventIn 事件发出时 start() 函数被执行。
3.1 参数传递与 EventIn 函数
当Script节点收到一个 eventIn 时,在url域被指定的一个相应的函数被调用, 它有两个参数。eventIn 的值value作为第一个参数被传递, timestamp 作为第二参数被传递, 。value的类型与 EventIn 的类型一样, timestamp 的类型是 SFTime 。
3.2eventsProcessed() 方法
作者可以定义名为 eventsProcessed 的函数,此函数在收到一系列事件以后被调用。实际编程中有一些运算过程需要在每一个EventIn函数返回后执行,另外一些需要当几个EventIn函数返回后才执行。对于后者的情况,创作者可把不必每次运行的执行过程放入eventsProcessed函数
例子:
创作者需要在动画运行的每步完成一个复杂的运动学运算。利用一个按钮形状与TouchSensor实现动画的单步播放。通常只要按钮被按下则执行一个EventIn函数,此函数增加运算次数,而后运动学运算进行。每次按钮被按下时都要运行复杂的运算,而用户按按钮的速度往往超过复杂运算的速度。为解决此问题,可让EventIn函数只处理累加运算次数,而把运动学运算放入eventsProcessed函数。有效的用户点击操作组成队列,当用户快速点击按钮时,时间步随点击次数增加,而复杂的运算只执行一次。此方法可使动画运行与用户操作同步。
eventsProcessed函数无参数。
3.3initialize() 方法
作者可以定义命为名initialize()的函数,此函数在Script节点被装载且无任何事件处理之前被调用。常用于初始化数据,为接收事件作准备。
initialize()函数无参数。Script节点装载时执行。
3.3shutdown() 方法
作者可以定义名为shutdown()的函数,此函数当相应的Script节点被删除,卸载,替代时调用,能通知浏览器 Script节点正被删除。因此他们能用来清理事件, 等等。
shutdown 函数无参数。Script节点被删除时执行 。
--------------------------------------------------------------------------------
4 访问域
Script节点的域, eventIns 和 eventOuts 可以由 VRMLScript 函数访问。所有节点的域仅能在Script内被访问到。Script节点的 eventIns 可以被传入, eventOuts 可以被发出。
4.1 访问Script节点的域与 EventOut
在Scrip节点中可通过域名使用被定义了的域值。域值可以被读取/写入。域值被函数调用前是不变的。Script节点中的 EventOuts 也能被读取。其值是最后发送的值。
4.2 访问其他节点的域和 EventOuts
通过一个指针,Script可以访问任何其他节点的 exposedField , eventIn 或 eventOut :
DEF SomeNode Transform { }
Script {
field SFNode node USE SomeNode
eventIn SFVec3f pos
directOutput TRUE
url \"...
function pos(value) {
node.set_translation = value;
}\"
}
以上例子发送一个 set_translation eventIn 到 Transform 节点。 传递节点中的域不能被存取,但是 exposedFields 可以用“ set_...“ 发送事件到eventIn , 或用”..._changed “从eventOut读当前值 。以上符合 VRML 路由规则。
4.3 发送 EventOuts
当执行的函数运行完毕后发送这个事件。这意味在函数执行一次的过程中eventOut被多次赋值,只有最后赋值的 eventOut 被送出。
--------------------------------------------------------------------------------
5 对象和函数定义
在 VRMLScript 中,对象有其固定的设置, 有其各自的属性( 即值 ) 和方法 ( 即函数 ) 。包括以下内容:
5.1 parseInt 和 parseFloat 函数
这两个函数把 String 值转换为 SFInt32 值或 SFFloat 值。
parseInt(s, [radix])
可使用“基数”选项将字符串“ s ”转换为整型数值。如果基数被省略,10 为默认的基数。number可以是十进制 ( 123 ), 十六进制 ( 0x5C ) 或 八进制 ( 0177 )。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。
parseFloat(s)
函数将字符串“ s ”转换为浮点型数值。数值可以为常用形式 ( 1.23 ) 或指数 ( 12E3 )形式。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。
5.2Browser 对象
这一节列出在浏览器对象中可用到的方法, 它允许 scripts 获得并且设置浏览器信息。
创建方法
None.
属性
无
方法
String getName()
获取 VRML 浏览器的名字。
String getVersion()
获取 VRML 浏览器的版本
SFFloat getCurrentSpeed()
获取当前场景的流畅度数值。
SFFloat getCurrentFrameRate()
获取当前场景每秒渲染贞数。
String getWorldURL()
获取当前被装载的场景的 URL 。
void replaceWorld(MFNode nodes)
以参数中的节点替代当前的场景。
MFNode createVrmlFromString(String vrmlSyntax)
由参数中的VRML语法字符串产生场景。
void createVrmlFromURL(MFString url, Node node, String event)
当 String 指定的事件发出时,由 URL 导入 VRML 场景。事件是被传递 MFNode 节点的 eventIn 域。
void addRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)
从 eventOut 增加一路由到 eventIn 。
void deleteRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)
删除 eventOut 与 eventIn 之间的路由。
void loadURL(MFString url, MFString parameter)
装载 URL , 使用参数可以重定向此url到另外的结构。如果目的地是当前场景包含的结构,这个方法可以无返回。
void setDescription(String description)
设置由浏览器显示的描述性文字。这与 Anchor 节点的description 域功能一样。
5.3Math 对象
Math对象在 VRMLScript 中是唯一有确切对象的例子。属性可用 Math.<属性名> 访问,方法可用 Math.<方法名> (参数)。
创建方法
无
属性
E
常数, e , 近似 2.718
LN10
10 的自然的对数, 近似 2.302
LN2
2 的自然的对数, 近似 0.693
PI
圆周率, 近似 3.1415
SQRT1_2
?的平方根, 近似 0.707
SQRT2
2的平方根, 近似 1.414
方法
注 number, number1, number2, base, and exponent 为标量表达式.
abs(number)
返回number的绝对值
acos(number)
返回反余弦 ( 弧度制) number
asin(number)
返回反正弦 ( 弧度制) number
atan(number)
返回反正切 ( 弧度制)
ceil(number)
取整
cos(number)
返回number的余弦
exp(number)
e 的number次乘方
floor(number)
返回小于等于number的整数
log(number)
自然对数 ( 以 e 为底 )
max(number1, number2)
返回 number1 和 number2 中较大的数
min(number1, number2)
返回 number1 和 number2 中较小的数
pow(base, exponent)
返回底数的指数次方
random()
在0和1之间返回一个假随机数。
round(number)
Returns the value of number rounded to the nearest integer
sin(number)
返回number的正弦
sqrt(number)
返回number的平方根
tan(number)
返回number的正切
5.4SFColor 对象
SFColor 对象对应于 VRML 2.0 SFColor 域。所有属性可使用句法 sfColorObjectName <属性>访问。所有的方法可使用句法 sfColorObjectName.method (参数)调用, sfColorObjectName 在此是一个 SFColor 对象的一个例子。
创建方法
sfColorObjectName = new SFColor(r, g, b)
r , g , b 是红,绿,蓝的颜色值
属性
r
红色
g
绿色
b
蓝色
方法
无
5.5SFImage 对象
SFImage 对象对应于 VRML 2.0 SFImage 域。
创建方法
sfImageObjectName = new SFImage(x, y, comp, array)
x 是图象的 x 尺寸。 y 是图象的 y 尺寸。 comp 是图象元素数值, 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha ) 。所有的这些价值是分级的。数组是一个 MFInt32 域 包含 x * y 图象的象素。每个象素的格式与 PixelTexture 文件格式一样。
属性
x
图象的 x 尺寸
y
图象的 y 尺寸
comp
图象元素的数值 ( 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha )
array
图象数据
方法
无
5.6SFNode 对象
SFNode 对象对应于 VRML 2.0 SFNode 域。
创建方法
sfNodeObjectName = new SFNode(vrmlstring)
vrmlstring 是包含 VRML 2.0 节点定义的 ASCII 字符串
属性
每个节点可以用 sfNodeObjectName.eventName 句法 把值分派到它的 eventIns 并且可获得 eventOuts 最后发出的值。
方法
无
5.7SFRotation 对象
SFRotation 对象对应于 VRML 2.0 SFRotation 域。
创建方法
sfRotationObjectName = new SFRotation(x, y, z, angle)
x , y , z 是旋转轴。angle 是旋转的角度 ( 弧度制 ) 。
sfRotationObjectName = new SFRotation(axis, angle)
axis 其值是旋转轴的一个 SFVec3f 对象。angle是旋转标量的角度 ( 弧度制)
sfRotationObjectName = new SFRotation(fromVector, toVector)
fromVector 和 toVector 是 SFVec3f 对象。对象存储从 fromVector 旋转到 toVector 的旋转值。
属性
x
返回轴的第一个矢量
y
返回轴的第二个矢量
z
返回轴的第三个矢量
angle
旋转角度相应的 SFFloat 值 ( 弧度制)
方法
getAxis()
返回旋转轴的 SFVec3f 值。
inverse()
返回这个对象的逆旋转的 SFRotation 值
multiply(rotation)
返回值是对象的 SFRotation 乘积的 SFRotation 。
multVec(vec)
返回值是这个对象的旋转矩阵乘积的 SFVec3f 。
setAxis(vec)
设置旋转轴矢量。
slerp(destRotation, t)
返回值当0 <= t <= 1 时是对象的 rotation 和 destRotation 之间的球形线性插值的 SFRotation 。 当t = 0 ,值是这个对象的 rotation 。 当t = 1 ,值是 destRotation 。
5.8 String 对象
String对象对应于 VRML 2.0 SFString 域。
创建方法
stringObjectName = new String(number)
number是任何数
stringObjectName = new String(string)
String是任何 UTF-8 字符串
属性
length
字符串中字符的个数
方法
charAt(index)
返回字符串中index指定的字符。index为0与length-1之间的一个整数值,length为字符串中字符的个数。
indexOf(string, [fromIndex])
返回string在对象中首次出现的索引,从fromIndex开始查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第0个字符开始。
lastIndexOf(string, [fromIndex])
返回string在对象中首次出现的索引,从fromIndex反向查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第length - 1个字符开始。
substring(index1, index2)
返回字符串中指定的部分字符串。若index1小于index2,返回从index1到index2之间的字符。若index1大于index2,返回从index2到index1之间的字符。若index1等于index2,返回空字符。index1 与 index2为0<=index1, index2toLowerCase()
把字符串中字符转换为小写
toUpperCase()
把字符串中字符转换为大写
特别操作符
+ (addition)
串联两个字符串与/或标量值成为一个新的字符串
5.9SFVec2f 对象
SFVec2f 对象对应于 VRML 2.0 SFVec2f 域。每个矢量值可使用 x 和 y 属性或使用 C 数组语法
访问( 即 sfVec2fObjectName [ 0 ] 或 sfVec2fObjectName [ 1 ]) 。
创建方法
sfVec2fObjectName = new SFVec2f(number1, number2)
number1 和 number2 是数字表达式
属性
x
返回第一个矢量值
y
返回第二个矢量值
方法
add(vec)
返回 SFVec2f 其值为对象分量与 vec 相加的值。
divide(number)
返回由 number 值划分了的 SFVec2f 值。
dot(vec)
返回矢量与 vec 的点积
length()
返回矢量的几何长度
multiply(number)
返回值是对象与 number 相乘后的 SFVec2f 。
negate()
返回值是对象负向量的 SFVec2f 。
normalize()
返回单位长度对象的 SFVec2f 。
subtract(vec)
返回对象分量减去 vec 后的 SFVec2f 。
5.10SFVec3f 对象
SFVec3f 对象对应于 VRML 2.0 SFVec3f 域。矢量的每个分量可使用 x , y , z 属性或使用 C 数组语法
访问( 即 sfVec3fObjectName [ 0 ], sfVec3fObjectName [ 1 ] 或 sfVec3fObjectName [ 2 ]) 。
创建方法
sfVec3fObjectName = new SFVec3f(number1, number2, number3)
number2 , number3 是标量表达式
属性
x
返回向量第一个值
y
返回向量第二个值
z
返回向量第三个值
方法
add(vec)
返回值为对象分量与 vec 相加后的 SFVec3f 。
cross(vec)
返回对象十字相乘的 SFVec3f 值。
divide(number)
返回由 number 值划分了的 SFVec3f 值。
dot(vec)
返回矢量与 vec 的点积
length()
返回矢量的几何长度
multiply(number)
返回值是对象与 number 相乘后的 SFVec3f 。
negate()
返回值是对象负向量的 SFVec3f 。
normalize()
返回单位长度对象的 SFVec3f 。
subtract(vec)
返回对象分量减去 vec 后的 SFVec3f 。
5.11MFColor 对象
MFColor 对象对应于 VRML 2.0 MFColor 域。它被用来存储 SFColor 对象的一个一维数组。数组的单个单元可使用标准的 C 语法引用( 例如 mfColorObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 SFColor ( 0 , 0 , 0 ) 。
创建方法
mfColorObjectName = new MFColor([SFColor, SFColor, ...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
在数组中包含单元数字的个数。
方法
无
5.12MFFloat 对象
MFFloat 对象对应于 VRML 2.0 MFFloat 域。它被用来存储 SFFloat 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfFloatObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0.0 。
创建方法
mfFloatObjectName = new MFFloat([number, number...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
在数组中单元包含数字的个数。
方法
无
5.13MFInt32 对象
MFInt32 对象对应于 VRML 2.0 MFInt32 域。它被用来存储 SFInt32 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0 。
创建方法
mfInt32ObjectName = new MFInt32([number, number, ...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
数组中元素个数的整数值,通过给length赋值可改变数组中元素的个数。
方法
无
5.14MFNode 对象
MFNode 对象对应于 VRML 2.0 MFNode 域。它被用来存储 SFNode 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 NULL。
创建方法
mfNodeObjectName = new MFNode([SFNode, SFNode, ...])
方法能以 0 个或 0 以上的 SFNode 值初始化数组单元。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.15MFRotation 对象
MFRotation 对象对应于 VRML 2.0 MFRotation 域。用来存储 SFRotation 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfRotationObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFRotation ( 0 , 0 , 1 , 0 ) 。
创建方法
mfRotationObjectName = new MFRotation([SFRotation, SFRotation, ...])
此创建方法可用0个或多个SFRotation值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.16MFString Object
对象 MFString 对象对应于 VRML 2.0 MFString 域。用来存储字符串对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfStringObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为空字符串
创建方法
mfStringObjectName = new MFString[string, string, ...])
此创建方法可用0个或多个SFString值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.17MFVec2f 对象
MFVec2f 对象对应于 VRML 2.0 MFVec2f 域。用来存储 SFVec2f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfVec2fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec2f ( 0 , 0 ) 。
创建方法
mfVec2fObjectName = new MFVec2f([SFVec2f, SFVec2f, ...])
此创建方法可用0个或多个SFVec2f值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.18MFVec3f 对象
MFVec3f 对象对应于 VRML 2.0 MFVec3f 域。它是被用来存储 SFVec3f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfVec3fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec3f ( 0 , 0 , 0 ) 。
创建方法
mfVec3fObjectName = new MFVec3f([SFVec3f, SFVec3f, ...])
此创建方法可用0个或多个SFVec3f值对数
Script可以源代码,单独的URL形式引入。
直接支持VRML 2.0的所有数据类型。
使用单独的函数接收外部事件,可以简化开发过程,提高处理速度。
使用简单的赋值向外部发送事件。
在表达式中可直接使用标量数据(SFTime, SFInt32, SFFloat, SFBool)。JavaScript 数据对象可直接转换为此四种数据类型的任意一种。例如,你可用a = time + 3使SFTime变量增加3秒。
可使用构造器轻松创建与转换大多数的数据类型。
数据与字符串对象与全部JavaScript函数兼容。
全部JavaScript string 方法与属性可用。标量可自动转化为字符串。
--------------------------------------------------------------------------------
1 语言
VRMLScript与JavaScript具有相似的语法形式
1.1 BNF 语法
script :
functions
NULL
functions:
functions function
function
function:
function beginFunction ( args ) statementBlock
beginFunction:
identifier
args:
args , identifier
identifier
NULL
stmntblk:
{ statements }
{ }
statement
statements :
statements statement
statement
statement :
ifStatement
forStatement
whileStatement
returnStatement
breakStatement
continueStatement
compoundExpression
ifStatement :
if ( compoundExpression ) statementBlock
if ( compoundExpression ) statementBlock else statementBlock
forStatement :
for ( optionalExpression optionalExpression optionalExpression ) statementBlock
whileStatement :
while ( compoundExpression ) statementBlock
returnStatement :
return compoundExpression
return
breakStatement :
break
continueStatement :
continue
compoundExpression :
expression , compoundExpression
expression
optionalExpression:
compoundExpression
NULL
expression : ( compoundExpression )
- expression
! expression
~ expression
leftVariable = expression
leftVariable += expression
leftVariable -= expression
leftVariable *= expression
leftVariable /= expression
leftVariable %= expression
leftVariable &= expression
leftVariable |= expression
leftVariable ^= expression
leftVariable <<= expression
leftVariable >>= expression
leftVariable >>>= expression
++ expression
-- expression
expression ++
expression --
expression ? expression : expression
expression == expression
expression != expression
expression < expression
expression <= expression
expression >= expression
expression > expression
expression + expression
expression - expression
expression * expression
expression / expression
expression % expression
expression && expression
expression || expression
expression & expression
expression | expression
expression ^ expression
expression << expression
expression >> expression
expression >>> expression
string
number
objectMethodCall
objectMemberAccess
functionCall
new constructor
arrayDereference
variable
functionCall :
identifier ( params )
constructor :
identifier ( params )
objectMethodCall :
expression . identifier ( params )
objectMethodAccess :
expression . identifier
params :
params , expression
expression
NULL
arrayDereference :
expression [ compoundExpression ]
leftVariable :
objectMethodAccess
arrayDereference
variable
variable :
identifier
string:
\' utf8 \'
number:
0{0-7}+
... ANSI C floating point number ...
0X{ 0-9 }+
0x{ 0-9 }+
TRUE
true
FALSE
false
identifier:
utf8Character { utf8 }*
utf8Character:
... any legal UTF8 character except 0-9 ...
utf8:
utf8Character
0-9
1.2 对象与变量
数据在 VRMLScript 中被描述为对象。对象类型对应于VRML的域 。一个变量包含对象的一个状态,并且可预先定义 ( 在 Script 节点中 ) 或局部定义。
1.2.1 取值, 命名
一个VRMLScript变量保存对象的一个状态。如果一个Script节点的field或eventOut被定义 ,则与此同名的变量在 Script 节点中全程可用。这个变量的类型与field或eventOut的类型一致。( 见数据变换 ) 。
变量名必须以一个字母 (\"a\"—\"z\"或“A“—”z“), 或下划线”_\"开头。随后的字符可以是任何字母或数字。变量名是区分大小写的?
变量可通过给新的变量名赋值来创建。变量的类型总是最后被赋值的类型。变量在它被初次引入的程序块范围内有效,Script节点中的field或eventOuts变量在整个节点范围内有效。
数字, 布尔, 字符串类型的文字可在VRML Script中使用。数字类型可以是十进制 ( 417 ), 十六进制 ( 0x5C ), 或 八进制 ( 0177 ) 形式。也可为浮点 ( 1.76 ) 或指数 ( 2.7e-12 ) 形式。所有的数字字符均为 number 类型。布尔类型值为“true”或“false”类型为 boolean 。字符串可以是在单引号 (\') 中的任何顺序的 UTF8 字符,类型为 String。特殊字符可按下列方式使用
字符 含义
\\b 退格
\\f 换页
\\n 换行
\\r 回车
\\t tab
\\\' 单引号
\\\" 双引号
\\\\ \\
举例:
Script {
field SFFloat aField 0
field SFVec3f aVector 0 0 0
eventOut SFInt32 anEventOut
eventIn SFBool event
url \"vrmlscript:
function event(value, timestamp) {
if (aField == 1.5) {
a = true; // \'a\' contains a boolean
}
if (a) { // this is NOT the same \'a\' as above!
value = 5; // ERROR,
// can\'t assign to function parameter!
}
aField = anEventOut; // SFInt32 converted to SFFloat
b = aField; // \'b\' contains a number
b = anEventOut; // \'b\' now contains a different number
aField = aVector; // ERROR,
// can\'t assign SFVec3f to SFFloat!
s = \'Two\\nLines\'; // \'s\' contains a String
}\"
}
1.2.2 对象与域
field变量保存的值为函数最后一次调用它的值。EventOut变量与域变量很类似。不同的是当一项任务分配了eventOut变量时,一个事件产生。
每个对象有一套属性和方法(见对象和函数定义)。属性(使用\" .\" 操作符)用于表达式或表达式的对象。方法(使用函数调用操作符)用于在对象上执行某些操作?
举例:
function someFunction() {
a = new SFColor(0.5, 0.5, 0.5);
b = a.r; // \'b\' contains 0.5
a.setHSV(0.1, 0.1, 0.1); // \'a\' now contains new properties
}
值a.r对应于SFColor的红色属性。方法a.setHSV()将颜色设置为HSV色彩模式。
1.2.3 构造对象
每种类型对象有一个相应的构造函数。构造函数允许使用灵活的参数对要构造的对象进行初始化。MF对象实质上是0个以上相应的SF对象组成的数组。使用关键词 new 与给定的数据类型可创造相应的对象。例如:
a = new SFVec3f(0, 1, 0); // \'a\' has a SFVec3f containing 0, 1, 0
b = new MFFloat(1, 2, 3, 4) // \'b\' has a MFFloat containing 4 floats
1.2.4 数据变换
数据变换的规则在下列表格列出:
类型 规则
String 数字或布尔转换为String
使用 parseInt() 或 parseFloat() 可把 String 转换为 number
Number 与 boolean 类型 将一个标量表达式赋给一个标量类型的固定变量(field 或 eventOut)时,转换为固定变量的类型
矢量类型
SFVec2f
SFVec3f
SFRotation
SFColor 只能与相同的类型组合
引用产生标量类型的值
SFImage 只容许赋值 (\'=\') 和 选择(\'.\') 操作
只能赋值 SFImage 类型
SFNode 只容许赋值 (\'=\') 和 选择(\'.\') 操作
只能赋值 SFNode 类型
MF types
MFString
MFInt32
MFFloat
MFVec2f
MFVec3f
MFRotation
MFColor
MFNode 只能与相同的类型组合
引用 (myArray[3]) 产生相应的 SF 类型.
引用后的 SF 类型遵守的规则与普通的 SF 类型相同.
1.2.5 MF 对象
大多数SF对象在VRMLScript中有一相应的MF对象。一个MF对象实质是上一个对象数组, 数组的每个单元是相应的 SF 类型对象。所有的 MF 对象有一个length属性用于返回或设置MF对象中单元的个数。数组索引以 0 开头。如果 vecArray 是一个 MFVec3f 对象则 vecArray [ 0 ] 是数组中的第一个SFVec3f 对象。
1.3 语句
VRMLScript 语句与 C 语言语句相似 。一个语句可出现一个 if 或 for 声明后。多重语句,或复合语句, 必须被放在\"{\"与\"}\"之间 。所有语句必须以\";\"结束。
例子:
if (a < b)
c = d; // simple statement, c is local to the if statement
else { // compound statement, c is no longer defined here
e = f; // e is local to the else block
c = h + 1;
} // e is no longer defined here
1.3.1 条件语句
if 语句计算一个表达式,并选择2条语句之一。简单的if语句中,如果表达的值不是 0 ,则执行后面语句。if...else 语句中,如果表达式的结果是 0 ,则执行else后的语句。在if...else嵌套的语句中, else与最近的if匹配。花括号能被用来打破这一限制。
例子:
if (a < 0) // simple if statement
if (a == 0)
if (b > 5) // if...else statement
else // this else clause matches the \'if (b > 5)\' statement
if (a == 0) {
if (b > 5)
}
else // this else clause matches the \'if (a == 0)\' statement
statement
1.3.2 循环语句
循环语句包含3个表达式控制循环的执行 。循环语句在循环执行前执行它的第一个表达式。在每次循环前计算它的第二个表达式, 如果表达式值为 0 ,退出循环,执行其他语句。循环重复执行, 直到第二表达式计算到 0 ,或遇到一个 break 语句,循环被终止。在典型的应用中,第一表达式初始化循环记数器, 第二计算它, 第三个对它进行累加。
例子:
for (i = 0; i < 10; ++i)
statement
while 语句包含控制循环执行的一个单个的表达式,被循环的语句列在后面。在每次循环前计算表达式, 如果表达式值为 0 ,退出循环。否则它执行语句并且再测试表达式。循环重复执行,直到表达式计算到 0 ,或遇到一个 break 语句,循环被终止.
例子:
while (i < 10)
statement
1.3.3 表达式语句
在 VRMLScript 中任何有效的表达式都是一个语句 两个最普通的表达式是函数调用和赋值表达式 ( 看下面 ) 。
1.3.4 Return 语句
Return 语句可不考虑嵌套结构而从函数中直接返回。如果指定,它的表达式可将计算结果返回被调用的函数。
例子:
if (a == 0) {
d = 1;
return 5 + d;
}
1.3.5 Break 语句
break语句退出嵌套循环。执行跟在循环语句后的语句。
例子:
while (i < 0) {
if (q == 5)
break;
other statements
}
// execution commences here upon break.
1.3.6 Continue 语句
Continue 语句跳到循环语句的最后。执行在循环后的语句。在for语句中,第二表达式测试第三个表达式的值,看循环是否应该继续。在for...in语句中next单元被赋值且循环继续。在 while 语句中表达式被测试是否循环应该继续。
例子:
for a in colorArray {
if (a[0] > 0.5)
continue;
other statements
// loop commences here upon continue.
}
1.4 符号
表达式用操作符把变量,对象,常数和其他表达式的值相结合。
例子:
a = -b; // unary prefix operator
a = b++; // unary postfix operator
a = b + c; // binary operator
a = b ? c : d; // tertiary operator
a = b * c + d; // compound expression
// the product of b * c produces a value which
// is added to d
1.4.1 赋值操作符
表达式 = 表达式可把右边表达式的结果赋与左边的表达式。左表达式必须可以存储右边的变量。包括简单的标识符, 操作符,对象的成员,函数的返回值。
例子:
a = 5; // simple assignment
a[3] = 4; // subscripted assignment
foo()[2] = 3; // function returning an MFField
另外,二元表达式可使用缩写的方式:‘+=’,‘-=’‘*=’,‘/=’,‘%=’,‘&=’,‘|=’,‘^=’,\'<<=\',\'>>=\',‘>>>=’。
例子:
a += 5; // adds 5 to the value of a and assigns it to a
a[3] &= 0x0000FFFF; // performs bitwise-and of a[3] and 0x0000FFFF
// assigning result to a[3]
1.4.2 算术操作符
算术操作符包括负号 (“-”), 补集 (“~”), 递加 (“++\"), 递减 (”--“) 和操作符 (” +“, “ - ”, “ * ”, “ / ”, “ % ” ) 。负号和补集是前缀。递加和递减是前缀或后缀 。剩余是二元的。
例子:
5 + b
(c + 5) * 7
(-b / 4) % 6
(c & 0xFF) | 256
递增与递减操作符做前缀或后缀时会有不同的结果。
例子:
a = 5; // Value of \'a\' is 5
b = a++; // Value of \'b\' is 5, value of \'a\' is 6
c = ++b; // Value of \'c\' is 6, value of \'b\' is 6
1.4.3 位操作符
位操作符包括与 ( “&” ), 或 ( “ | ” ), 异或 ( “ ^” ), 左移 ( “ <<\'), 右移 (\">>\") 。这些都是二元操作符并且对任何标量类型有效。当他们被使用时,标量的值在操作前被转换为 SFInt32 ,运算后返回原来的表达式类型。当把他们用于 SFFloat 或 SFTime 时,可能发生 roundoff 错误。移动操作符左边指定操作数,右边指定移动位数。
例子:
a & 0x0FF // clears upper 24 bits of \'a\'
a >> 5 // shift \'a\' 5 bits to the right, sign extend
1.4.4 逻辑,比较操作符
逻辑表达式包括逻辑与(\'&&\'), 逻辑或(\'||\'), 逻辑非(\'!\'),比较操作 (\'<\', \'<=\', \'==\', \'!=\', \'>=\', \'>\')。每个表达式取值 0 (false) 或 1 (true)。常数 true, false, TRUE, 和 FALSE 都可使用。
例子:
a < 5
b > 0 && c > 1
!((a > 4) || (b < 6))
1.4.5 字符串操作符
所有的比较操作符可用来为词典排序的字符串作比较。另外操作符 + 和“ += ”能被用来连接两个字符串。任何标量与的一个字符串连接,则标量首先转换为一个字符串,然后施行连接。一个字符串要转换为标量类型可使用 parseInt () 与 parseFloat () 函数。
例子:
\'A one and \' + \'a two\' // result is \"A one and a two\"
\'The magic number is \' + 7 // result is \'The magic number is 7\'
a = 5; // \'a\' contains an SFTime
a += \'is correct\'; // \'a\' is now the String \'5 is correct\'
1.4.6 操作符优先级
相等优先级的操作顺序列在下面的表格中。使用“ ( ”与“ ) ”括起的操作首先被执行。
例子:
a = b + c * d; // c * d is evaluated first
a = (b + c) * d; // b + c is evaluated first
a = b * c / d; // b * c is evaluated first
// (\'*\' and \'/\' have equal precedence, evaluation
// order is left-to-right)
优先操作规则:
操作符类型 操作符 注释
逗号 ,
赋值 = += -= *= /= %=
<<= >>= >>>= &= ^= |= right-to-left
条件 ?: tertiary operator
逻辑或 ||
逻辑与 &&
位或 |
位异或 ^
位与 &
相等 == !=
比较 < <= > >=
位移动 << >> >>>
加/减 + -
乘/除 * / %
取反/累加 ! ~ - ++ -- unary operators
引用, 成员 () [] .
--------------------------------------------------------------------------------
2 Script 节点的 url 域支持的协议
脚本的 url 域可以引用包含 VRMLScript 的url代码:
Script { url \"http://foo.com/myScript.vs\" }
vrmlscript :协议允许脚本被如下嵌入::
Script { url \"vrmlscript: function foo() { ... }\" }
url 域可以这样引用一个远端的文件或嵌入的代码:
Script {
url [ \"http://foo.com/myScript.vs\",
\"vrmlscript: function foo() { ... }\" ]
}
2.1文件扩展名
VRMLScript 源代码的文件扩展名是 .vs
2.2MIME Type
VRMLScript 源代码的 MIME 类型如下定义:
application/x-vrmlscript
--------------------------------------------------------------------------------
3 处理 EventIn 事件
送到Script节点的事件被传递给相应的 VRMLScript 函数。在Script节点的 url 域指定Script,是必要的。函数的名字与 eventIn 一样,eventIn 事件的值value和事件的发生时间 timestamp 作为参数传递,( 看“参数传递和 EventIn 函数” ) 。如果在Script中没有定义相应的 VRMLScript 函数,则浏览器无法执行相应操作。
例如, 下列Script节点有一个eventIn 域其名字是start :
Script {
eventIn SFBool start
url \"vrmlscript: function start(value, timestamp) { ... }\"
}
在上面的例子中,当start eventIn 事件发出时 start() 函数被执行。
3.1 参数传递与 EventIn 函数
当Script节点收到一个 eventIn 时,在url域被指定的一个相应的函数被调用, 它有两个参数。eventIn 的值value作为第一个参数被传递, timestamp 作为第二参数被传递, 。value的类型与 EventIn 的类型一样, timestamp 的类型是 SFTime 。
3.2eventsProcessed() 方法
作者可以定义名为 eventsProcessed 的函数,此函数在收到一系列事件以后被调用。实际编程中有一些运算过程需要在每一个EventIn函数返回后执行,另外一些需要当几个EventIn函数返回后才执行。对于后者的情况,创作者可把不必每次运行的执行过程放入eventsProcessed函数
例子:
创作者需要在动画运行的每步完成一个复杂的运动学运算。利用一个按钮形状与TouchSensor实现动画的单步播放。通常只要按钮被按下则执行一个EventIn函数,此函数增加运算次数,而后运动学运算进行。每次按钮被按下时都要运行复杂的运算,而用户按按钮的速度往往超过复杂运算的速度。为解决此问题,可让EventIn函数只处理累加运算次数,而把运动学运算放入eventsProcessed函数。有效的用户点击操作组成队列,当用户快速点击按钮时,时间步随点击次数增加,而复杂的运算只执行一次。此方法可使动画运行与用户操作同步。
eventsProcessed函数无参数。
3.3initialize() 方法
作者可以定义命为名initialize()的函数,此函数在Script节点被装载且无任何事件处理之前被调用。常用于初始化数据,为接收事件作准备。
initialize()函数无参数。Script节点装载时执行。
3.3shutdown() 方法
作者可以定义名为shutdown()的函数,此函数当相应的Script节点被删除,卸载,替代时调用,能通知浏览器 Script节点正被删除。因此他们能用来清理事件, 等等。
shutdown 函数无参数。Script节点被删除时执行 。
--------------------------------------------------------------------------------
4 访问域
Script节点的域, eventIns 和 eventOuts 可以由 VRMLScript 函数访问。所有节点的域仅能在Script内被访问到。Script节点的 eventIns 可以被传入, eventOuts 可以被发出。
4.1 访问Script节点的域与 EventOut
在Scrip节点中可通过域名使用被定义了的域值。域值可以被读取/写入。域值被函数调用前是不变的。Script节点中的 EventOuts 也能被读取。其值是最后发送的值。
4.2 访问其他节点的域和 EventOuts
通过一个指针,Script可以访问任何其他节点的 exposedField , eventIn 或 eventOut :
DEF SomeNode Transform { }
Script {
field SFNode node USE SomeNode
eventIn SFVec3f pos
directOutput TRUE
url \"...
function pos(value) {
node.set_translation = value;
}\"
}
以上例子发送一个 set_translation eventIn 到 Transform 节点。 传递节点中的域不能被存取,但是 exposedFields 可以用“ set_...“ 发送事件到eventIn , 或用”..._changed “从eventOut读当前值 。以上符合 VRML 路由规则。
4.3 发送 EventOuts
当执行的函数运行完毕后发送这个事件。这意味在函数执行一次的过程中eventOut被多次赋值,只有最后赋值的 eventOut 被送出。
--------------------------------------------------------------------------------
5 对象和函数定义
在 VRMLScript 中,对象有其固定的设置, 有其各自的属性( 即值 ) 和方法 ( 即函数 ) 。包括以下内容:
5.1 parseInt 和 parseFloat 函数
这两个函数把 String 值转换为 SFInt32 值或 SFFloat 值。
parseInt(s, [radix])
可使用“基数”选项将字符串“ s ”转换为整型数值。如果基数被省略,10 为默认的基数。number可以是十进制 ( 123 ), 十六进制 ( 0x5C ) 或 八进制 ( 0177 )。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。
parseFloat(s)
函数将字符串“ s ”转换为浮点型数值。数值可以为常用形式 ( 1.23 ) 或指数 ( 12E3 )形式。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。
5.2Browser 对象
这一节列出在浏览器对象中可用到的方法, 它允许 scripts 获得并且设置浏览器信息。
创建方法
None.
属性
无
方法
String getName()
获取 VRML 浏览器的名字。
String getVersion()
获取 VRML 浏览器的版本
SFFloat getCurrentSpeed()
获取当前场景的流畅度数值。
SFFloat getCurrentFrameRate()
获取当前场景每秒渲染贞数。
String getWorldURL()
获取当前被装载的场景的 URL 。
void replaceWorld(MFNode nodes)
以参数中的节点替代当前的场景。
MFNode createVrmlFromString(String vrmlSyntax)
由参数中的VRML语法字符串产生场景。
void createVrmlFromURL(MFString url, Node node, String event)
当 String 指定的事件发出时,由 URL 导入 VRML 场景。事件是被传递 MFNode 节点的 eventIn 域。
void addRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)
从 eventOut 增加一路由到 eventIn 。
void deleteRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)
删除 eventOut 与 eventIn 之间的路由。
void loadURL(MFString url, MFString parameter)
装载 URL , 使用参数可以重定向此url到另外的结构。如果目的地是当前场景包含的结构,这个方法可以无返回。
void setDescription(String description)
设置由浏览器显示的描述性文字。这与 Anchor 节点的description 域功能一样。
5.3Math 对象
Math对象在 VRMLScript 中是唯一有确切对象的例子。属性可用 Math.<属性名> 访问,方法可用 Math.<方法名> (参数)。
创建方法
无
属性
E
常数, e , 近似 2.718
LN10
10 的自然的对数, 近似 2.302
LN2
2 的自然的对数, 近似 0.693
PI
圆周率, 近似 3.1415
SQRT1_2
?的平方根, 近似 0.707
SQRT2
2的平方根, 近似 1.414
方法
注 number, number1, number2, base, and exponent 为标量表达式.
abs(number)
返回number的绝对值
acos(number)
返回反余弦 ( 弧度制) number
asin(number)
返回反正弦 ( 弧度制) number
atan(number)
返回反正切 ( 弧度制)
ceil(number)
取整
cos(number)
返回number的余弦
exp(number)
e 的number次乘方
floor(number)
返回小于等于number的整数
log(number)
自然对数 ( 以 e 为底 )
max(number1, number2)
返回 number1 和 number2 中较大的数
min(number1, number2)
返回 number1 和 number2 中较小的数
pow(base, exponent)
返回底数的指数次方
random()
在0和1之间返回一个假随机数。
round(number)
Returns the value of number rounded to the nearest integer
sin(number)
返回number的正弦
sqrt(number)
返回number的平方根
tan(number)
返回number的正切
5.4SFColor 对象
SFColor 对象对应于 VRML 2.0 SFColor 域。所有属性可使用句法 sfColorObjectName <属性>访问。所有的方法可使用句法 sfColorObjectName.method (参数)调用, sfColorObjectName 在此是一个 SFColor 对象的一个例子。
创建方法
sfColorObjectName = new SFColor(r, g, b)
r , g , b 是红,绿,蓝的颜色值
属性
r
红色
g
绿色
b
蓝色
方法
无
5.5SFImage 对象
SFImage 对象对应于 VRML 2.0 SFImage 域。
创建方法
sfImageObjectName = new SFImage(x, y, comp, array)
x 是图象的 x 尺寸。 y 是图象的 y 尺寸。 comp 是图象元素数值, 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha ) 。所有的这些价值是分级的。数组是一个 MFInt32 域 包含 x * y 图象的象素。每个象素的格式与 PixelTexture 文件格式一样。
属性
x
图象的 x 尺寸
y
图象的 y 尺寸
comp
图象元素的数值 ( 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha )
array
图象数据
方法
无
5.6SFNode 对象
SFNode 对象对应于 VRML 2.0 SFNode 域。
创建方法
sfNodeObjectName = new SFNode(vrmlstring)
vrmlstring 是包含 VRML 2.0 节点定义的 ASCII 字符串
属性
每个节点可以用 sfNodeObjectName.eventName 句法 把值分派到它的 eventIns 并且可获得 eventOuts 最后发出的值。
方法
无
5.7SFRotation 对象
SFRotation 对象对应于 VRML 2.0 SFRotation 域。
创建方法
sfRotationObjectName = new SFRotation(x, y, z, angle)
x , y , z 是旋转轴。angle 是旋转的角度 ( 弧度制 ) 。
sfRotationObjectName = new SFRotation(axis, angle)
axis 其值是旋转轴的一个 SFVec3f 对象。angle是旋转标量的角度 ( 弧度制)
sfRotationObjectName = new SFRotation(fromVector, toVector)
fromVector 和 toVector 是 SFVec3f 对象。对象存储从 fromVector 旋转到 toVector 的旋转值。
属性
x
返回轴的第一个矢量
y
返回轴的第二个矢量
z
返回轴的第三个矢量
angle
旋转角度相应的 SFFloat 值 ( 弧度制)
方法
getAxis()
返回旋转轴的 SFVec3f 值。
inverse()
返回这个对象的逆旋转的 SFRotation 值
multiply(rotation)
返回值是对象的 SFRotation 乘积的 SFRotation 。
multVec(vec)
返回值是这个对象的旋转矩阵乘积的 SFVec3f 。
setAxis(vec)
设置旋转轴矢量。
slerp(destRotation, t)
返回值当0 <= t <= 1 时是对象的 rotation 和 destRotation 之间的球形线性插值的 SFRotation 。 当t = 0 ,值是这个对象的 rotation 。 当t = 1 ,值是 destRotation 。
5.8 String 对象
String对象对应于 VRML 2.0 SFString 域。
创建方法
stringObjectName = new String(number)
number是任何数
stringObjectName = new String(string)
String是任何 UTF-8 字符串
属性
length
字符串中字符的个数
方法
charAt(index)
返回字符串中index指定的字符。index为0与length-1之间的一个整数值,length为字符串中字符的个数。
indexOf(string, [fromIndex])
返回string在对象中首次出现的索引,从fromIndex开始查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第0个字符开始。
lastIndexOf(string, [fromIndex])
返回string在对象中首次出现的索引,从fromIndex反向查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第length - 1个字符开始。
substring(index1, index2)
返回字符串中指定的部分字符串。若index1小于index2,返回从index1到index2之间的字符。若index1大于index2,返回从index2到index1之间的字符。若index1等于index2,返回空字符。index1 与 index2为0<=index1, index2toLowerCase()
把字符串中字符转换为小写
toUpperCase()
把字符串中字符转换为大写
特别操作符
+ (addition)
串联两个字符串与/或标量值成为一个新的字符串
5.9SFVec2f 对象
SFVec2f 对象对应于 VRML 2.0 SFVec2f 域。每个矢量值可使用 x 和 y 属性或使用 C 数组语法
访问( 即 sfVec2fObjectName [ 0 ] 或 sfVec2fObjectName [ 1 ]) 。
创建方法
sfVec2fObjectName = new SFVec2f(number1, number2)
number1 和 number2 是数字表达式
属性
x
返回第一个矢量值
y
返回第二个矢量值
方法
add(vec)
返回 SFVec2f 其值为对象分量与 vec 相加的值。
divide(number)
返回由 number 值划分了的 SFVec2f 值。
dot(vec)
返回矢量与 vec 的点积
length()
返回矢量的几何长度
multiply(number)
返回值是对象与 number 相乘后的 SFVec2f 。
negate()
返回值是对象负向量的 SFVec2f 。
normalize()
返回单位长度对象的 SFVec2f 。
subtract(vec)
返回对象分量减去 vec 后的 SFVec2f 。
5.10SFVec3f 对象
SFVec3f 对象对应于 VRML 2.0 SFVec3f 域。矢量的每个分量可使用 x , y , z 属性或使用 C 数组语法
访问( 即 sfVec3fObjectName [ 0 ], sfVec3fObjectName [ 1 ] 或 sfVec3fObjectName [ 2 ]) 。
创建方法
sfVec3fObjectName = new SFVec3f(number1, number2, number3)
number2 , number3 是标量表达式
属性
x
返回向量第一个值
y
返回向量第二个值
z
返回向量第三个值
方法
add(vec)
返回值为对象分量与 vec 相加后的 SFVec3f 。
cross(vec)
返回对象十字相乘的 SFVec3f 值。
divide(number)
返回由 number 值划分了的 SFVec3f 值。
dot(vec)
返回矢量与 vec 的点积
length()
返回矢量的几何长度
multiply(number)
返回值是对象与 number 相乘后的 SFVec3f 。
negate()
返回值是对象负向量的 SFVec3f 。
normalize()
返回单位长度对象的 SFVec3f 。
subtract(vec)
返回对象分量减去 vec 后的 SFVec3f 。
5.11MFColor 对象
MFColor 对象对应于 VRML 2.0 MFColor 域。它被用来存储 SFColor 对象的一个一维数组。数组的单个单元可使用标准的 C 语法引用( 例如 mfColorObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 SFColor ( 0 , 0 , 0 ) 。
创建方法
mfColorObjectName = new MFColor([SFColor, SFColor, ...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
在数组中包含单元数字的个数。
方法
无
5.12MFFloat 对象
MFFloat 对象对应于 VRML 2.0 MFFloat 域。它被用来存储 SFFloat 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfFloatObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0.0 。
创建方法
mfFloatObjectName = new MFFloat([number, number...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
在数组中单元包含数字的个数。
方法
无
5.13MFInt32 对象
MFInt32 对象对应于 VRML 2.0 MFInt32 域。它被用来存储 SFInt32 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0 。
创建方法
mfInt32ObjectName = new MFInt32([number, number, ...])
方法能以 0 个或 0 以上的数值初始化数组单元。
属性
length
数组中元素个数的整数值,通过给length赋值可改变数组中元素的个数。
方法
无
5.14MFNode 对象
MFNode 对象对应于 VRML 2.0 MFNode 域。它被用来存储 SFNode 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 NULL。
创建方法
mfNodeObjectName = new MFNode([SFNode, SFNode, ...])
方法能以 0 个或 0 以上的 SFNode 值初始化数组单元。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.15MFRotation 对象
MFRotation 对象对应于 VRML 2.0 MFRotation 域。用来存储 SFRotation 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfRotationObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFRotation ( 0 , 0 , 1 , 0 ) 。
创建方法
mfRotationObjectName = new MFRotation([SFRotation, SFRotation, ...])
此创建方法可用0个或多个SFRotation值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.16MFString Object
对象 MFString 对象对应于 VRML 2.0 MFString 域。用来存储字符串对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfStringObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为空字符串
创建方法
mfStringObjectName = new MFString[string, string, ...])
此创建方法可用0个或多个SFString值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.17MFVec2f 对象
MFVec2f 对象对应于 VRML 2.0 MFVec2f 域。用来存储 SFVec2f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfVec2fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec2f ( 0 , 0 ) 。
创建方法
mfVec2fObjectName = new MFVec2f([SFVec2f, SFVec2f, ...])
此创建方法可用0个或多个SFVec2f值对数组进行初始化。
属性
length
数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.
方法
无
5.18MFVec3f 对象
MFVec3f 对象对应于 VRML 2.0 MFVec3f 域。它是被用来存储 SFVec3f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfVec3fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec3f ( 0 , 0 , 0 ) 。
创建方法
mfVec3fObjectName = new MFVec3f([SFVec3f, SFVec3f, ...])
此创建方法可用0个或多个SFVec3f值对数
分类: VRML | 评论: 0 | 浏览: 186
本文链接地址:http://www.chinavideoonline.com/vrml/vrml_030.htm
向上
-
返回 -
发表评论
相关文章
Viewpoint技术教程(四)
Viewpoint技术教程(三)
Viewpoint技术教程(二)
Viewpoint技术教程(一)
结合VRML实现ASP虚拟现实网页
用PHP动态生成虚拟现实VRML网页
本文链接地址:http://www.chinavideoonline.com/vrml/vrml_030.htm
发表评论 相关文章
Viewpoint技术教程(四)
Viewpoint技术教程(三)
Viewpoint技术教程(二)
Viewpoint技术教程(一)
结合VRML实现ASP虚拟现实网页
用PHP动态生成虚拟现实VRML网页
(C) 2004-2006 中国视频在线 技术支持:梦想家网络工作室