信息系统项目管理师_2024年软考学习应考交流_信息系统项目管理师考试

 找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 8818|回复: 15
打印 上一主题 下一主题

虚拟现实vrml script 语法介绍

  [复制链接]

该用户从未签到

升级  30.8%

跳转到指定楼层
楼主
发表于 2006-4-24 08:37:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<p>1 语言<br/>VRMLScript与JavaScript具有相似的语法形式</p><p>1.1&nbsp; BNF 语法<br/>script :&nbsp; <br/>functions&nbsp; <br/>NULL&nbsp; <br/>functions:&nbsp; <br/>functions function&nbsp; <br/>function&nbsp; <br/>function:&nbsp; <br/>function beginFunction ( args ) statementBlock&nbsp; <br/>beginFunction:&nbsp; <br/>identifier&nbsp; <br/>args:&nbsp; <br/>args , identifier&nbsp; <br/>identifier&nbsp; <br/>NULL&nbsp; <br/>stmntblk:&nbsp; <br/>{ statements }&nbsp; <br/>{ }&nbsp; <br/>statement&nbsp; <br/>statements :&nbsp; <br/>statements statement&nbsp; <br/>statement&nbsp; <br/>statement :&nbsp; <br/>ifStatement&nbsp; <br/>forStatement&nbsp; <br/>whileStatement&nbsp; <br/>returnStatement ;&nbsp; <br/>breakStatement ;&nbsp; <br/>continueStatement ;&nbsp; <br/>compoundExpression ;&nbsp; <br/>ifStatement :&nbsp; <br/>if ( compoundExpression ) statementBlock&nbsp; <br/>if ( compoundExpression ) statementBlock else statementBlock&nbsp; <br/>forStatement :&nbsp; <br/>for ( optionalExpression ; optionalExpression ; optionalExpression ) statementBlock&nbsp; <br/>  <br/>whileStatement :&nbsp; <br/>while ( compoundExpression ) statementBlock <br/>returnStatement :&nbsp; <br/>return compoundExpression&nbsp; <br/>return&nbsp; <br/>breakStatement :&nbsp; <br/>break&nbsp; <br/>continueStatement :&nbsp; <br/>continue&nbsp; <br/>compoundExpression :&nbsp; <br/>expression , compoundExpression&nbsp; <br/>expression&nbsp; <br/>optionalExpression:&nbsp; <br/>compoundExpression&nbsp; <br/>NULL&nbsp; <br/>expression : ( compoundExpression )&nbsp; <br/>- expression&nbsp; <br/>! expression&nbsp; <br/>~ expression&nbsp; <br/>leftVariable = expression&nbsp; <br/>leftVariable += expression&nbsp; <br/>leftVariable -= expression&nbsp; <br/>leftVariable *= expression&nbsp; <br/>leftVariable /= expression&nbsp; <br/>leftVariable %= expression&nbsp; <br/>leftVariable &amp;= expression&nbsp; <br/>leftVariable |= expression&nbsp; <br/>leftVariable ^= expression&nbsp; <br/>leftVariable &lt;&lt;= expression&nbsp; <br/>leftVariable &gt;&gt;= expression&nbsp; <br/>leftVariable &gt;&gt;&gt;= expression&nbsp; <br/>++ expression&nbsp; <br/>-- expression&nbsp; <br/>expression ++&nbsp; <br/>expression --&nbsp; <br/>expression ? expression : expression&nbsp; <br/>expression == expression&nbsp; <br/>expression != expression&nbsp; <br/>expression &lt; expression&nbsp; <br/>expression &lt;= expression&nbsp; <br/>expression &gt;= expression&nbsp; <br/>expression &gt; expression&nbsp; <br/>expression + expression&nbsp; <br/>expression - expression&nbsp; <br/>expression * expression&nbsp; <br/>expression / expression&nbsp; <br/>expression % expression&nbsp; <br/>expression &amp;&amp; expression&nbsp; <br/>expression || expression&nbsp; <br/>expression &amp; expression&nbsp; <br/>expression | expression&nbsp; <br/>expression ^ expression&nbsp; <br/>expression &lt;&lt; expression&nbsp; <br/>expression &gt;&gt; expression&nbsp; <br/>expression &gt;&gt;&gt; expression&nbsp; <br/>string&nbsp; <br/>number&nbsp; <br/>objectMethodCall&nbsp; <br/>objectMemberAccess&nbsp; <br/>functionCall&nbsp; <br/>new constructor&nbsp; <br/>arrayDereference&nbsp; <br/>variable&nbsp; <br/>functionCall :&nbsp; <br/>identifier ( params ) <br/>constructor :&nbsp; <br/>identifier ( params ) <br/>objectMethodCall :&nbsp; <br/>expression . identifier ( params )&nbsp; <br/>objectMethodAccess :&nbsp; <br/>expression . identifier&nbsp; <br/>params :&nbsp; <br/>params , expression&nbsp; <br/>expression&nbsp; <br/>NULL <br/>arrayDereference :&nbsp; <br/>expression [ compoundExpression ] <br/>leftVariable :&nbsp; <br/>objectMethodAccess&nbsp; <br/>arrayDereference&nbsp; <br/>variable <br/>variable :&nbsp; <br/>identifier&nbsp; <br/>string:&nbsp; <br/>' utf8 '&nbsp; <br/>number:&nbsp; <br/>0{0-7}+&nbsp; <br/>... ANSI C floating point number ...&nbsp; <br/>0X{ 0-9 }+&nbsp; <br/>0x{ 0-9 }+&nbsp; <br/>TRUE&nbsp; <br/>true&nbsp; <br/>FALSE&nbsp; <br/>false <br/>identifier:&nbsp; <br/>utf8Character { utf8 }*&nbsp; <br/>utf8Character:&nbsp; <br/>... any legal UTF8 character except 0-9 ...&nbsp; <br/>utf8:&nbsp; <br/>utf8Character&nbsp; <br/>0-9&nbsp; <br/>1.2 对象与变量<br/>数据在 VRMLScript 中被描述为对象。对象类型对应于VRML的域 。一个变量包含对象的一个状态,并且可预先定义 ( 在 Script 节点中 ) 或局部定义。 </p><p>1.2.1 取值, 命名<br/>一个VRMLScript变量保存对象的一个状态。如果一个Script节点的field或eventOut被定义&nbsp;&nbsp; ,则与此同名的变量在 Script 节点中全程可用。这个变量的类型与field或eventOut的类型一致。( 见数据变换 ) 。 </p><p>变量名必须以一个字母 ("a"—"z"或“A“—”z“), 或下划线”_"开头。随后的字符可以是任何字母或数字。变量名是区分大小写的? </p><p>变量可通过给新的变量名赋值来创建。变量的类型总是最后被赋值的类型。变量在它被初次引入的程序块范围内有效,Script节点中的field或eventOuts变量在整个节点范围内有效。</p><p>数字, 布尔, 字符串类型的文字可在VRML Script中使用。数字类型可以是十进制 ( 417 ), 十六进制 ( 0x5C ), 或 八进制 ( 0177 ) 形式。也可为浮点 ( 1.76 ) 或指数 ( 2.7e-12 ) 形式。所有的数字字符均为 number 类型。布尔类型值为“true”或“false”类型为 boolean 。字符串可以是在单引号 (') 中的任何顺序的 UTF8 字符,类型为 String。特殊字符可按下列方式使用</p><p>字符&nbsp;&nbsp;&nbsp; 含义&nbsp;&nbsp;&nbsp; <br/>\b 退格 <br/>\f 换页 <br/>\n 换行 <br/>\r 回车 <br/>\t tab <br/>\' 单引号 <br/>\" 双引号 <br/>\\ \ </p><p>举例:</p><p>Script {</p><p>&nbsp;&nbsp;&nbsp; field&nbsp;&nbsp;&nbsp; SFFloat aField&nbsp; 0</p><p>&nbsp;&nbsp;&nbsp; field&nbsp;&nbsp;&nbsp; SFVec3f aVector 0 0 0</p><p>&nbsp;&nbsp;&nbsp; eventOut SFInt32 anEventOut</p><p>&nbsp;&nbsp;&nbsp; eventIn&nbsp; SFBool&nbsp; event</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; url "vrmlscript:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function event(value, timestamp) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (aField == 1.5) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'a' contains a boolean</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this is NOT the same 'a' as above!</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ERROR,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; can't assign to function parameter!</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aField = anEventOut; // SFInt32 converted to SFFloat</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = aField;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'b' contains a number</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = anEventOut;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'b' now contains a different number</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aField = aVector;&nbsp;&nbsp;&nbsp; // ERROR,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; can't assign SFVec3f to SFFloat!</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = 'Two\nLines';&nbsp;&nbsp;&nbsp; // 's' contains a String</p><p>&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp; }"</p><p>}<br/></p>
[此贴子已经被作者于2006-4-24 8:38:47编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 顶 踩

该用户从未签到

升级  30.8%

沙发
 楼主| 发表于 2006-4-24 08:37:48 | 只看该作者
1.2.2 对象与域<br/>field变量保存的值为函数最后一次调用它的值。EventOut变量与域变量很类似。不同的是当一项任务分配了eventOut变量时,一个事件产生。&nbsp; <p>每个对象有一套属性和方法(见对象和函数定义)。属性(使用" ." 操作符)用于表达式或表达式的对象。方法(使用函数调用操作符)用于在对象上执行某些操作? </p><p>举例:</p><p>function someFunction() {</p><p>&nbsp;&nbsp;&nbsp; a = new SFColor(0.5, 0.5, 0.5);</p><p>&nbsp;&nbsp;&nbsp; b = a.r;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'b' contains 0.5</p><p>&nbsp;&nbsp;&nbsp; a.setHSV(0.1, 0.1, 0.1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'a' now contains new properties</p><p>}<br/>值a.r对应于SFColor的红色属性。方法a.setHSV()将颜色设置为HSV色彩模式。&nbsp; </p><p>1.2.3 构造对象<br/>每种类型对象有一个相应的构造函数。构造函数允许使用灵活的参数对要构造的对象进行初始化。MF对象实质上是0个以上相应的SF对象组成的数组。使用关键词 new 与给定的数据类型可创造相应的对象。例如:&nbsp; </p><p>a = new SFVec3f(0, 1, 0);&nbsp;&nbsp; // 'a' has a SFVec3f containing 0, 1, 0</p><p>b = new MFFloat(1, 2, 3, 4) // 'b' has a MFFloat containing 4 floats<br/>1.2.4 数据变换<br/>数据变换的规则在下列表格列出: <br/>&nbsp; </p><p>类型 规则<br/>&nbsp;<br/>String 数字或布尔转换为String&nbsp; <br/>使用 parseInt() 或 parseFloat() 可把 String 转换为 number&nbsp; <br/>&nbsp;<br/>Number 与 boolean 类型&nbsp; 将一个标量表达式赋给一个标量类型的固定变量(field 或 eventOut)时,转换为固定变量的类型 <br/>&nbsp;<br/>矢量类型 <br/>SFVec2f&nbsp; <br/>SFVec3f&nbsp; <br/>SFRotation&nbsp; <br/>SFColor&nbsp;&nbsp; 只能与相同的类型组合 <br/>引用产生标量类型的值 <br/>&nbsp;<br/>SFImage 只容许赋值 ('=') 和 选择('.') 操作&nbsp; <br/>只能赋值 SFImage 类型&nbsp; <br/>&nbsp;<br/>SFNode 只容许赋值 ('=') 和 选择('.') 操作&nbsp; <br/>只能赋值 SFNode 类型&nbsp; <br/>&nbsp;<br/>MF types&nbsp; <br/>MFString&nbsp; <br/>MFInt32&nbsp; <br/>MFFloat&nbsp; <br/>MFVec2f&nbsp; <br/>MFVec3f&nbsp; <br/>MFRotation&nbsp; <br/>MFColor&nbsp; <br/>MFNode&nbsp;&nbsp; 只能与相同的类型组合 <br/>引用 (myArray[3]) 产生相应的 SF 类型.&nbsp; <br/>引用后的 SF 类型遵守的规则与普通的 SF 类型相同.&nbsp; <br/>&nbsp;</p><p>1.2.5 MF 对象<br/>大多数SF对象在VRMLScript中有一相应的MF对象。一个MF对象实质是上一个对象数组, 数组的每个单元是相应的 SF 类型对象。所有的 MF 对象有一个length属性用于返回或设置MF对象中单元的个数。数组索引以 0 开头。如果 vecArray 是一个 MFVec3f 对象则 vecArray [ 0 ] 是数组中的第一个SFVec3f 对象。&nbsp; </p><p>1.3 语句<br/>VRMLScript 语句与 C 语言语句相似 。一个语句可出现一个 if 或 for 声明后。多重语句,或复合语句, 必须被放在"{"与"}"之间 。所有语句必须以";"结束。&nbsp; </p><p>例子:&nbsp; </p><p>if (a &lt; b)</p><p>&nbsp;&nbsp;&nbsp; c = d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // simple statement, c is local to the if statement</p><p>&nbsp;</p><p>else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // compound statement, c is no longer defined here</p><p>&nbsp;&nbsp;&nbsp; e = f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // e is local to the else block</p><p>&nbsp;&nbsp;&nbsp; c = h + 1;</p><p>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // e is no longer defined here<br/>1.3.1 条件语句<br/>if 语句计算一个表达式,并选择2条语句之一。简单的if语句中,如果表达的值不是 0 ,则执行后面语句。if...else 语句中,如果表达式的结果是 0 ,则执行else后的语句。在if...else嵌套的语句中, else与最近的if匹配。花括号能被用来打破这一限制。&nbsp; </p><p>例子:&nbsp; </p><p>if (a &lt; 0)&nbsp; // simple if statement</p><p>&nbsp;&nbsp;&nbsp; &lt;statement&gt;</p><p>&nbsp;</p><p>if (a == 0)</p><p>&nbsp;&nbsp;&nbsp; if (b &gt; 5)&nbsp; // if...else statement</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;statement&gt;</p><p>&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this else clause matches the 'if (b &gt; 5)' statement</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;statement&gt;</p><p>&nbsp;</p><p>if (a == 0) {</p><p>&nbsp;&nbsp;&nbsp; if (b &gt; 5)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;statement&gt;</p><p>}</p><p>else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this else clause matches the 'if (a == 0)' statement</p><p>&nbsp;&nbsp;&nbsp; &lt;statement&gt;<br/>1.3.2 循环语句<br/>循环语句包含3个表达式控制循环的执行 。循环语句在循环执行前执行它的第一个表达式。在每次循环前计算它的第二个表达式, 如果表达式值为 0 ,退出循环,执行其他语句。循环重复执行, 直到第二表达式计算到 0 ,或遇到一个 break 语句,循环被终止。在典型的应用中,第一表达式初始化循环记数器, 第二计算它, 第三个对它进行累加。 </p><p>例子:&nbsp; </p><p>for (i = 0; i &lt; 10; ++i)</p><p>&nbsp;&nbsp;&nbsp; &lt;statement&gt;<br/>while 语句包含控制循环执行的一个单个的表达式,被循环的语句列在后面。在每次循环前计算表达式, 如果表达式值为 0 ,退出循环。否则它执行语句并且再测试表达式。循环重复执行,直到表达式计算到 0 ,或遇到一个 break 语句,循环被终止. </p><p>例子:&nbsp; </p><p>while (i &lt; 10)</p><p>&nbsp;&nbsp;&nbsp; &lt;statement&gt;<br/>1.3.3 表达式语句<br/>在 VRMLScript 中任何有效的表达式都是一个语句 两个最普通的表达式是函数调用和赋值表达式 ( 看下面 ) 。&nbsp; <br/></p>

该用户从未签到

升级  30.8%

藤椅
 楼主| 发表于 2006-4-24 08:38:15 | 只看该作者
<p>1.3.4 Return 语句<br/>Return 语句可不考虑嵌套结构而从函数中直接返回。如果指定,它的表达式可将计算结果返回被调用的函数。&nbsp; </p><p>例子:&nbsp; </p><p>if (a == 0) {</p><p>&nbsp;&nbsp;&nbsp; d = 1;</p><p>&nbsp;&nbsp;&nbsp; return 5 + d;</p><p>}<br/>1.3.5 Break 语句<br/>break语句退出嵌套循环。执行跟在循环语句后的语句。 </p><p>例子:&nbsp; </p><p>while (i &lt; 0) {</p><p>&nbsp;&nbsp;&nbsp; if (q == 5) </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p><p>&nbsp;&nbsp;&nbsp; &lt;other statements&gt;</p><p>}</p><p></p><p>// execution commences here upon break.<br/>1.3.6 Continue 语句<br/>Continue 语句跳到循环语句的最后。执行在循环后的语句。在for语句中,第二表达式测试第三个表达式的值,看循环是否应该继续。在for...in语句中next单元被赋值且循环继续。在 while 语句中表达式被测试是否循环应该继续。 </p><p>例子:&nbsp; </p><p>for a in colorArray {</p><p>&nbsp;&nbsp;&nbsp; if (a[0] &gt; 0.5)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</p><p>&nbsp;&nbsp;&nbsp; &lt;other statements&gt;</p><p></p><p>&nbsp;&nbsp;&nbsp; // loop commences here upon continue.</p><p>}<br/>1.4 符号<br/>表达式用操作符把变量,对象,常数和其他表达式的值相结合。 </p><p>例子:&nbsp; </p><p>a = -b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // unary prefix operator</p><p>a = b++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // unary postfix operator</p><p>a = b + c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // binary operator</p><p>a = b ? c : d;&nbsp;&nbsp; // tertiary operator</p><p>a = b * c + d;&nbsp;&nbsp; // compound expression</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the product of b * c produces a value which</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // is added to d<br/>1.4.1 赋值操作符<br/>表达式 = 表达式可把右边表达式的结果赋与左边的表达式。左表达式必须可以存储右边的变量。包括简单的标识符, 操作符,对象的成员,函数的返回值。&nbsp; </p><p>例子:&nbsp; </p><p>a = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // simple assignment</p><p>a[3] = 4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // subscripted assignment</p><p>foo()[2] = 3;&nbsp;&nbsp; // function returning an MFField<br/> </p><p>另外,二元表达式可使用缩写的方式:‘+=’,‘-=’‘*=’,‘/=’,‘%=’,‘&amp;=’,‘|=’,‘^=’,'&lt;&lt;=','&gt;&gt;=',‘&gt;&gt;&gt;=’。</p><p>例子:&nbsp; </p><p>a += 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // adds 5 to the value of a and assigns it to a</p><p>a[3] &amp;= 0x0000FFFF;&nbsp; // performs bitwise-and of a[3] and 0x0000FFFF</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // assigning result to a[3]<br/>1.4.2&nbsp; 算术操作符<br/>算术操作符包括负号 (“-”), 补集 (“~”), 递加 (“++"), 递减 (”--“) 和操作符 (” +“, “ - ”, “ * ”, “ / ”, “ % ” ) 。负号和补集是前缀。递加和递减是前缀或后缀 。剩余是二元的。&nbsp; </p><p>例子:&nbsp; </p><p>5 + b</p><p>(c + 5) * 7</p><p>(-b / 4) % 6</p><p>(c &amp; 0xFF) | 256<br/>递增与递减操作符做前缀或后缀时会有不同的结果。 </p><p>例子:</p><p>a = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Value of 'a' is 5</p><p>b = a++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Value of 'b' is 5, value of 'a' is 6</p><p>c = ++b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Value of 'c' is 6, value of 'b' is 6<br/>1.4.3 位操作符<br/>位操作符包括与 ( “&amp;” ), 或 ( “ | ” ), 异或 ( “ ^” ), 左移 ( “ &lt;&lt;'), 右移 ("&gt;&gt;") 。这些都是二元操作符并且对任何标量类型有效。当他们被使用时,标量的值在操作前被转换为 SFInt32 ,运算后返回原来的表达式类型。当把他们用于 SFFloat 或 SFTime 时,可能发生 roundoff 错误。移动操作符左边指定操作数,右边指定移动位数。&nbsp; </p><p>例子:</p><p>a &amp; 0x0FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // clears upper 24 bits of 'a'</p><p>a &gt;&gt; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // shift 'a' 5 bits to the right, sign extend<br/>1.4.4 逻辑,比较操作符<br/>逻辑表达式包括逻辑与('&amp;&amp;'), 逻辑或('||'), 逻辑非('!'),比较操作 ('&lt;', '&lt;=', '==', '!=', '&gt;=', '&gt;')。每个表达式取值 0 (false) 或 1 (true)。常数 true, false, TRUE, 和 FALSE 都可使用。</p><p>例子: </p><p>a &lt; 5</p><p>b &gt; 0 &amp;&amp; c &gt; 1</p><p>!((a &gt; 4) || (b &lt; 6))<br/>1.4.5 字符串操作符<br/>所有的比较操作符可用来为词典排序的字符串作比较。另外操作符 + 和“ += ”能被用来连接两个字符串。任何标量与的一个字符串连接,则标量首先转换为一个字符串,然后施行连接。一个字符串要转换为标量类型可使用 parseInt () 与 parseFloat () 函数。 </p><p>例子:</p><p>'A one and ' + 'a two'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // result is "A one and a two"</p><p>'The magic number is ' + 7&nbsp;&nbsp;&nbsp;&nbsp; // result is 'The magic number is 7'</p><p>a = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'a' contains an SFTime</p><p>a += 'is correct';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 'a' is now the String '5 is correct'<br/>1.4.6 操作符优先级<br/>相等优先级的操作顺序列在下面的表格中。使用“ ( ”与“ ) ”括起的操作首先被执行。&nbsp; </p><p>例子:&nbsp; </p><p>a = b + c * d;&nbsp;&nbsp;&nbsp; // c * d is evaluated first</p><p>a = (b + c) * d;&nbsp; // b + c is evaluated first</p><p>a = b * c / d;&nbsp;&nbsp;&nbsp; // b * c is evaluated first </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ('*' and '/' have equal precedence, evaluation</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // order is left-to-right)<br/>优先操作规则:&nbsp; <br/>&nbsp; </p><p>操作符类型 操作符 注释 <br/>逗号&nbsp; ,   <br/>赋值 = += -= *= /= %=&nbsp; <br/>&lt;&lt;= &gt;&gt;= &gt;&gt;&gt;= &amp;= ^= |= right-to-left <br/>条件 ?: tertiary operator <br/>逻辑或 ||   <br/>逻辑与 &amp;&amp;   <br/>位或 |   <br/>位异或 ^   <br/>位与 &amp;   <br/>相等 == !=   <br/>比较 &lt; &lt;= &gt; &gt;=   <br/>位移动 &lt;&lt; &gt;&gt; &gt;&gt;&gt;   <br/>加/减 + -   <br/>乘/除 * / %   <br/>取反/累加 ! ~ - ++ -- unary operators <br/>引用, 成员 () [] .   </p><p> </p><p><br/><br/></p>

该用户从未签到

升级  30.8%

板凳
 楼主| 发表于 2006-4-24 08:39:06 | 只看该作者
<p>2&nbsp; Script 节点的 url 域支持的协议 <br/>脚本的 url 域可以引用包含 VRMLScript 的url代码: </p><p>&nbsp;Script {&nbsp; url "<a href="http://foo.com/myScript.vs">http://foo.com/myScript.vs</a>"&nbsp; }<br/>vrmlscript :协议允许脚本被如下嵌入::&nbsp; </p><p>&nbsp;&nbsp;&nbsp; Script {&nbsp; url "vrmlscript: function foo() { ... }"&nbsp;&nbsp; }<br/>url 域可以这样引用一个远端的文件或嵌入的代码: </p><p>&nbsp;&nbsp;&nbsp; Script { </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url [ "<a href="http://foo.com/myScript.vs">http://foo.com/myScript.vs</a>",</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "vrmlscript: function foo() { ... }" ]</p><p>&nbsp;&nbsp;&nbsp; }<br/>2.1 文件扩展名 <br/>VRMLScript 源代码的文件扩展名是 .vs&nbsp; </p><p>2.2 MIME Type <br/>VRMLScript 源代码的 MIME 类型如下定义: </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-vrmlscript<br/> </p><p><br/>3 处理 EventIn 事件<br/>送到Script节点的事件被传递给相应的 VRMLScript 函数。在Script节点的 url 域指定Script,是必要的。函数的名字与 eventIn 一样,eventIn 事件的值value和事件的发生时间 timestamp 作为参数传递,( 看“参数传递和 EventIn 函数” ) 。如果在Script中没有定义相应的 VRMLScript 函数,则浏览器无法执行相应操作。&nbsp; </p><p>例如, 下列Script节点有一个eventIn 域其名字是start : </p><p>&nbsp;&nbsp;&nbsp; Script { </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eventIn SFBool start</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url "vrmlscript: function start(value, timestamp) { ... }"</p><p>&nbsp;&nbsp;&nbsp; }<br/>在上面的例子中,当start eventIn 事件发出时 start() 函数被执行。 </p><p>3.1 参数传递与 EventIn 函数<br/>当Script节点收到一个 eventIn 时,在url域被指定的一个相应的函数被调用, 它有两个参数。eventIn 的值value作为第一个参数被传递, timestamp 作为第二参数被传递, 。value的类型与 EventIn 的类型一样, timestamp 的类型是 SFTime 。 </p><p>3.2 eventsProcessed() 方法<br/>作者可以定义名为 eventsProcessed 的函数,此函数在收到一系列事件以后被调用。实际编程中有一些运算过程需要在每一个EventIn函数返回后执行,另外一些需要当几个EventIn函数返回后才执行。对于后者的情况,创作者可把不必每次运行的执行过程放入eventsProcessed函数 </p><p>例子:&nbsp; <br/>创作者需要在动画运行的每步完成一个复杂的运动学运算。利用一个按钮形状与TouchSensor实现动画的单步播放。通常只要按钮被按下则执行一个EventIn函数,此函数增加运算次数,而后运动学运算进行。每次按钮被按下时都要运行复杂的运算,而用户按按钮的速度往往超过复杂运算的速度。为解决此问题,可让EventIn函数只处理累加运算次数,而把运动学运算放入eventsProcessed函数。有效的用户点击操作组成队列,当用户快速点击按钮时,时间步随点击次数增加,而复杂的运算只执行一次。此方法可使动画运行与用户操作同步。 <br/>eventsProcessed函数无参数。</p><p>3.3 initialize() 方法<br/>作者可以定义命为名initialize()的函数,此函数在Script节点被装载且无任何事件处理之前被调用。常用于初始化数据,为接收事件作准备。&nbsp; </p><p>initialize()函数无参数。Script节点装载时执行。 </p><p>3.3 shutdown() 方法<br/>作者可以定义名为shutdown()的函数,此函数当相应的Script节点被删除,卸载,替代时调用,能通知浏览器 Script节点正被删除。因此他们能用来清理事件, 等等。&nbsp; </p><p>shutdown 函数无参数。Script节点被删除时执行 。&nbsp; <br/></p>
[此贴子已经被作者于2006-4-24 8:40:11编辑过]

该用户从未签到

升级  30.8%

报纸
 楼主| 发表于 2006-4-24 08:40:22 | 只看该作者
<p>2&nbsp; Script 节点的 url 域支持的协议 <br/>脚本的 url 域可以引用包含 VRMLScript 的url代码: </p><p>&nbsp;Script {&nbsp; url "<a href="http://foo.com/myScript.vs">http://foo.com/myScript.vs</a>"&nbsp; }<br/>vrmlscript :协议允许脚本被如下嵌入::&nbsp; </p><p>&nbsp;&nbsp;&nbsp; Script {&nbsp; url "vrmlscript: function foo() { ... }"&nbsp;&nbsp; }<br/>url 域可以这样引用一个远端的文件或嵌入的代码: </p><p>&nbsp;&nbsp;&nbsp; Script { </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url [ "<a href="http://foo.com/myScript.vs">http://foo.com/myScript.vs</a>",</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "vrmlscript: function foo() { ... }" ]</p><p>&nbsp;&nbsp;&nbsp; }<br/>2.1 文件扩展名 <br/>VRMLScript 源代码的文件扩展名是 .vs&nbsp; </p><p>2.2 MIME Type <br/>VRMLScript 源代码的 MIME 类型如下定义: </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-vrmlscript<br/> </p><p><br/>--------------------------------------------------------------------------------</p><p>3 处理 EventIn 事件<br/>送到Script节点的事件被传递给相应的 VRMLScript 函数。在Script节点的 url 域指定Script,是必要的。函数的名字与 eventIn 一样,eventIn 事件的值value和事件的发生时间 timestamp 作为参数传递,( 看“参数传递和 EventIn 函数” ) 。如果在Script中没有定义相应的 VRMLScript 函数,则浏览器无法执行相应操作。&nbsp; </p><p>例如, 下列Script节点有一个eventIn 域其名字是start : </p><p>&nbsp;&nbsp;&nbsp; Script { </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eventIn SFBool start</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url "vrmlscript: function start(value, timestamp) { ... }"</p><p>&nbsp;&nbsp;&nbsp; }<br/>在上面的例子中,当start eventIn 事件发出时 start() 函数被执行。 </p><p>3.1 参数传递与 EventIn 函数<br/>当Script节点收到一个 eventIn 时,在url域被指定的一个相应的函数被调用, 它有两个参数。eventIn 的值value作为第一个参数被传递, timestamp 作为第二参数被传递, 。value的类型与 EventIn 的类型一样, timestamp 的类型是 SFTime 。 </p><p>3.2 eventsProcessed() 方法<br/>作者可以定义名为 eventsProcessed 的函数,此函数在收到一系列事件以后被调用。实际编程中有一些运算过程需要在每一个EventIn函数返回后执行,另外一些需要当几个EventIn函数返回后才执行。对于后者的情况,创作者可把不必每次运行的执行过程放入eventsProcessed函数 </p><p>例子:&nbsp; <br/>创作者需要在动画运行的每步完成一个复杂的运动学运算。利用一个按钮形状与TouchSensor实现动画的单步播放。通常只要按钮被按下则执行一个EventIn函数,此函数增加运算次数,而后运动学运算进行。每次按钮被按下时都要运行复杂的运算,而用户按按钮的速度往往超过复杂运算的速度。为解决此问题,可让EventIn函数只处理累加运算次数,而把运动学运算放入eventsProcessed函数。有效的用户点击操作组成队列,当用户快速点击按钮时,时间步随点击次数增加,而复杂的运算只执行一次。此方法可使动画运行与用户操作同步。 <br/>eventsProcessed函数无参数。</p><p>3.3 initialize() 方法<br/>作者可以定义命为名initialize()的函数,此函数在Script节点被装载且无任何事件处理之前被调用。常用于初始化数据,为接收事件作准备。&nbsp; </p><p>initialize()函数无参数。Script节点装载时执行。 </p><p>3.3 shutdown() 方法<br/>作者可以定义名为shutdown()的函数,此函数当相应的Script节点被删除,卸载,替代时调用,能通知浏览器 Script节点正被删除。因此他们能用来清理事件, 等等。&nbsp; </p><p>shutdown 函数无参数。Script节点被删除时执行 。&nbsp; <br/></p>

该用户从未签到

升级  30.8%

地板
 楼主| 发表于 2006-4-24 08:40:46 | 只看该作者
<p>5 对象和函数定义<br/>在 VRMLScript 中,对象有其固定的设置, 有其各自的属性( 即值 ) 和方法 ( 即函数 ) 。包括以下内容:&nbsp; </p><p>5.1 parseInt 和 parseFloat 函数<br/>这两个函数把 String 值转换为 SFInt32 值或 SFFloat 值。&nbsp; </p><p>parseInt(s, [radix])&nbsp; <br/>可使用“基数”选项将字符串“ s ”转换为整型数值。如果基数被省略,10 为默认的基数。number可以是十进制 ( 123 ), 十六进制 ( 0x5C ) 或 八进制 ( 0177 )。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。 <br/>parseFloat(s)&nbsp; <br/>函数将字符串“ s ”转换为浮点型数值。数值可以为常用形式 ( 1.23 ) 或指数 ( 12E3 )形式。遇到无法识别的字符转换会终止于此字符。如果字符串开头是无法识别的字符, 函数反回值为 0 。 <br/>5.2 Browser 对象<br/>这一节列出在浏览器对象中可用到的方法, 它允许 scripts 获得并且设置浏览器信息。 </p><p>创建方法<br/>None.&nbsp;&nbsp; </p><p>属性<br/>无 </p><p>方法<br/>String getName()&nbsp; <br/>获取 VRML 浏览器的名字。 <br/>String getVersion()&nbsp; <br/>获取 VRML 浏览器的版本&nbsp; <br/>SFFloat getCurrentSpeed()&nbsp; <br/>获取当前场景的流畅度数值。 <br/>SFFloat getCurrentFrameRate()&nbsp; <br/>获取当前场景每秒渲染贞数。&nbsp; <br/>String getWorldURL()&nbsp; <br/>获取当前被装载的场景的 URL 。 <br/>void replaceWorld(MFNode nodes)&nbsp; <br/>以参数中的节点替代当前的场景。 <br/>MFNode createVrmlFromString(String vrmlSyntax)&nbsp; <br/>由参数中的VRML语法字符串产生场景。 <br/>void createVrmlFromURL(MFString url, Node node, String event)&nbsp; <br/>当 String 指定的事件发出时,由 URL 导入 VRML 场景。事件是被传递 MFNode 节点的 eventIn 域。 <br/>void addRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)&nbsp; <br/>从 eventOut 增加一路由到 eventIn 。 <br/>void deleteRoute(SFNode fromNode, String fromEventOut, SFNode toNode, String toEventIn)&nbsp; <br/>删除 eventOut 与 eventIn 之间的路由。 <br/>void loadURL(MFString url, MFString parameter)&nbsp; <br/>装载 URL , 使用参数可以重定向此url到另外的结构。如果目的地是当前场景包含的结构,这个方法可以无返回。 <br/>void setDescription(String description)&nbsp; <br/>设置由浏览器显示的描述性文字。这与 Anchor 节点的description 域功能一样。&nbsp; <br/>5.3 Math 对象<br/>Math对象在 VRMLScript 中是唯一有确切对象的例子。属性可用 Math.&lt;属性名&gt; 访问,方法可用 Math.&lt;方法名&gt; (参数)。&nbsp; </p><p>创建方法<br/>无 </p><p>属性<br/>E&nbsp; <br/>常数, e , 近似 2.718&nbsp; <br/>LN10&nbsp; <br/>10 的自然的对数, 近似 2.302&nbsp; <br/>LN2&nbsp; <br/>2 的自然的对数, 近似 0.693&nbsp; <br/>I&nbsp; <br/>圆周率, 近似 3.1415&nbsp; <br/>SQRT1_2&nbsp; <br/>?的平方根, 近似 0.707&nbsp; <br/>SQRT2&nbsp; <br/>2的平方根, 近似 1.414&nbsp; <br/>方法<br/>注 number, number1, number2, base, and exponent 为标量表达式. </p><p>abs(number)&nbsp; <br/>返回number的绝对值 <br/>acos(number)&nbsp; <br/>返回反余弦 ( 弧度制) number&nbsp; <br/>asin(number)&nbsp; <br/>返回反正弦 ( 弧度制) number&nbsp; <br/>atan(number)&nbsp; <br/>返回反正切 ( 弧度制) <br/>ceil(number)&nbsp; <br/>取整 <br/>cos(number)&nbsp; <br/>返回number的余弦&nbsp; <br/>exp(number)&nbsp; <br/>e 的number次乘方 <br/>floor(number)&nbsp; <br/>返回小于等于number的整数&nbsp; <br/>log(number)&nbsp; <br/>自然对数 ( 以 e 为底 ) <br/>max(number1, number2)&nbsp; <br/>返回 number1 和 number2 中较大的数 <br/>min(number1, number2)&nbsp; <br/>返回 number1 和 number2 中较小的数 <br/>pow(base, exponent)&nbsp; <br/>返回底数的指数次方&nbsp; <br/>random()&nbsp; <br/>在0和1之间返回一个假随机数。 <br/>round(number)&nbsp; <br/>Returns the value of number rounded to the nearest integer&nbsp; <br/>sin(number)&nbsp; <br/>返回number的正弦&nbsp; <br/>sqrt(number)&nbsp; <br/>返回number的平方根 <br/>tan(number)&nbsp; <br/>返回number的正切 <br/>5.4 SFColor 对象<br/>SFColor 对象对应于 VRML 2.0 SFColor 域。所有属性可使用句法 sfColorObjectName &lt;属性&gt;访问。所有的方法可使用句法 sfColorObjectName.method (参数)调用, sfColorObjectName 在此是一个 SFColor 对象的一个例子。&nbsp; </p><p>创建方法<br/>sfColorObjectName = new SFColor(r, g, b)&nbsp; <br/>r , g , b 是红,绿,蓝的颜色值 <br/>属性<br/>r&nbsp; <br/>红色 <br/>g&nbsp; <br/>绿色 <br/>b&nbsp; <br/>蓝色 <br/>方法<br/>无 <br/></p>

该用户从未签到

升级  30.8%

7
 楼主| 发表于 2006-4-24 08:41:06 | 只看该作者
<p>5.5 SFImage 对象<br/>SFImage 对象对应于 VRML 2.0 SFImage 域。&nbsp; </p><p>创建方法<br/>sfImageObjectName = new SFImage(x, y, comp, array)&nbsp; <br/>x 是图象的 x 尺寸。 y 是图象的 y 尺寸。 comp 是图象元素数值, 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha ) 。所有的这些价值是分级的。数组是一个 MFInt32 域 包含 x * y 图象的象素。每个象素的格式与 PixelTexture 文件格式一样。 <br/>属性<br/>x&nbsp; <br/>图象的 x 尺寸 <br/>y&nbsp; <br/>图象的 y 尺寸&nbsp; <br/>comp&nbsp; <br/>图象元素的数值 ( 1 为灰度, 2 为 灰度+alpha , 3 为 rgb , 4 为 rgb+alpha )&nbsp; <br/>array&nbsp; <br/>图象数据 <br/>方法<br/>无 </p><p>5.6 SFNode 对象 <br/>SFNode 对象对应于 VRML 2.0 SFNode 域。 </p><p>创建方法<br/>sfNodeObjectName = new SFNode(vrmlstring)&nbsp; <br/>vrmlstring 是包含 VRML 2.0 节点定义的 ASCII 字符串 <br/>属性<br/>每个节点可以用 sfNodeObjectName.eventName 句法 把值分派到它的 eventIns 并且可获得 eventOuts 最后发出的值。&nbsp; </p><p>方法<br/>无&nbsp; <br/>5.7 SFRotation 对象<br/>SFRotation 对象对应于 VRML 2.0 SFRotation 域。&nbsp; </p><p>创建方法<br/>sfRotationObjectName = new SFRotation(x, y, z, angle)&nbsp; <br/>x , y , z 是旋转轴。angle 是旋转的角度 ( 弧度制 ) 。 <br/>sfRotationObjectName = new SFRotation(axis, angle)&nbsp; <br/>axis 其值是旋转轴的一个 SFVec3f 对象。angle是旋转标量的角度 ( 弧度制)&nbsp; <br/>sfRotationObjectName = new SFRotation(fromVector, toVector)&nbsp; <br/>fromVector 和 toVector 是 SFVec3f 对象。对象存储从 fromVector 旋转到 toVector 的旋转值。 <br/>属性<br/>x&nbsp; <br/>返回轴的第一个矢量&nbsp; <br/>y&nbsp; <br/>返回轴的第二个矢量&nbsp; <br/>z&nbsp; <br/>返回轴的第三个矢量 <br/>angle&nbsp; <br/>旋转角度相应的 SFFloat 值 ( 弧度制)&nbsp; <br/>方法<br/>getAxis()&nbsp; <br/>返回旋转轴的 SFVec3f 值。 <br/>inverse()&nbsp; <br/>返回这个对象的逆旋转的 SFRotation 值 <br/>multiply(rotation)&nbsp; <br/>返回值是对象的 SFRotation 乘积的 SFRotation 。 <br/>multVec(vec)&nbsp; <br/>返回值是这个对象的旋转矩阵乘积的 SFVec3f 。 <br/>setAxis(vec)&nbsp; <br/>设置旋转轴矢量。&nbsp; <br/>slerp(destRotation, t)&nbsp; <br/>返回值当0 &lt;= t &lt;= 1 时是对象的 rotation 和 destRotation 之间的球形线性插值的 SFRotation 。 当t = 0 ,值是这个对象的 rotation 。 当t = 1 ,值是 destRotation 。&nbsp; <br/>5.8 String 对象<br/>String对象对应于 VRML 2.0 SFString 域。&nbsp; </p><p>创建方法<br/>stringObjectName = new String(number)&nbsp; <br/>number是任何数&nbsp; <br/>stringObjectName = new String(string)&nbsp; <br/>String是任何 UTF-8 字符串 <br/>属性<br/>length&nbsp; <br/>字符串中字符的个数 <br/>方法<br/>charAt(index)&nbsp; <br/>返回字符串中index指定的字符。index为0与length-1之间的一个整数值,length为字符串中字符的个数。 <br/>indexOf(string, [fromIndex])&nbsp; <br/>返回string在对象中首次出现的索引,从fromIndex开始查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第0个字符开始。 <br/>lastIndexOf(string, [fromIndex])&nbsp; <br/>返回string在对象中首次出现的索引,从fromIndex反向查找。fromIndex必须在0 与 length -1之间。若fromIndex不指定,查找从第length - 1个字符开始。 <br/>substring(index1, index2)&nbsp; <br/>返回字符串中指定的部分字符串。若index1小于index2,返回从index1到index2之间的字符。若index1大于index2,返回从index2到index1之间的字符。若index1等于index2,返回空字符。index1 与 index2为0&lt;=index1, index2&lt;length之间的整数。 <br/>toLowerCase()&nbsp; <br/>把字符串中字符转换为小写 <br/>toUpperCase()&nbsp; <br/>把字符串中字符转换为大写 <br/>特别操作符<br/>+ (addition)&nbsp; <br/>串联两个字符串与/或标量值成为一个新的字符串 <br/>5.9 SFVec2f 对象<br/>SFVec2f 对象对应于 VRML 2.0 SFVec2f 域。每个矢量值可使用 x 和 y 属性或使用 C 数组语法 <br/>访问( 即 sfVec2fObjectName [ 0 ] 或 sfVec2fObjectName [ 1 ]) 。&nbsp; </p><p>创建方法<br/>sfVec2fObjectName = new SFVec2f(number1, number2)&nbsp; <br/>number1 和 number2 是数字表达式 <br/>属性<br/>x&nbsp; <br/>返回第一个矢量值 <br/>y&nbsp; <br/>返回第二个矢量值 <br/>方法<br/>add(vec)&nbsp; <br/>返回 SFVec2f 其值为对象分量与 vec 相加的值。 <br/>divide(number)&nbsp; <br/>返回由 number 值划分了的 SFVec2f 值。 <br/>dot(vec)&nbsp; <br/>返回矢量与 vec 的点积 <br/>length()&nbsp; <br/>返回矢量的几何长度 <br/>multiply(number)&nbsp; <br/>返回值是对象与 number 相乘后的 SFVec2f 。 <br/>negate()&nbsp; <br/>返回值是对象负向量的 SFVec2f 。 <br/>normalize()&nbsp; <br/>返回单位长度对象的 SFVec2f 。 <br/>subtract(vec)&nbsp; <br/>返回对象分量减去 vec 后的 SFVec2f 。&nbsp; <br/>5.10 SFVec3f 对象<br/>SFVec3f 对象对应于 VRML 2.0 SFVec3f 域。矢量的每个分量可使用 x , y , z 属性或使用 C 数组语法 <br/>访问( 即 sfVec3fObjectName [ 0 ], sfVec3fObjectName [ 1 ] 或 sfVec3fObjectName [ 2 ]) 。&nbsp; </p><p>创建方法<br/>sfVec3fObjectName = new SFVec3f(number1, number2, number3)&nbsp; <br/>number2 , number3 是标量表达式 <br/>属性<br/>x&nbsp; <br/>返回向量第一个值 <br/>y&nbsp; <br/>返回向量第二个值&nbsp; <br/>z&nbsp; <br/>返回向量第三个值 <br/>方法<br/>add(vec)&nbsp; <br/>返回值为对象分量与 vec 相加后的 SFVec3f 。 <br/>cross(vec)&nbsp; <br/>返回对象十字相乘的 SFVec3f 值。 <br/>divide(number)&nbsp; <br/>返回由 number 值划分了的 SFVec3f 值。 <br/>dot(vec)&nbsp; <br/>返回矢量与 vec 的点积&nbsp; <br/>length()&nbsp; <br/>返回矢量的几何长度 <br/>multiply(number)&nbsp; <br/>返回值是对象与 number 相乘后的 SFVec3f 。 <br/>negate()&nbsp; <br/>返回值是对象负向量的 SFVec3f 。 <br/>normalize()&nbsp; <br/>返回单位长度对象的 SFVec3f 。 <br/>subtract(vec)&nbsp; <br/>返回对象分量减去 vec 后的 SFVec3f 。</p>

该用户从未签到

升级  30.8%

8
 楼主| 发表于 2006-4-24 08:41:23 | 只看该作者
<p>5.11 MFColor 对象<br/>MFColor 对象对应于 VRML 2.0 MFColor 域。它被用来存储 SFColor 对象的一个一维数组。数组的单个单元可使用标准的 C 语法引用( 例如 mfColorObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 SFColor ( 0 , 0 , 0 ) 。&nbsp; </p><p>创建方法<br/>mfColorObjectName = new MFColor([SFColor, SFColor, ...])&nbsp; <br/>方法能以 0 个或 0 以上的数值初始化数组单元。 <br/>属性<br/>length&nbsp; <br/>在数组中包含单元数字的个数。 <br/>方法<br/>无 </p><p>5.12 MFFloat 对象<br/>MFFloat 对象对应于 VRML 2.0 MFFloat 域。它被用来存储 SFFloat 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfFloatObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0.0 。&nbsp; </p><p>创建方法<br/>mfFloatObjectName = new MFFloat([number, number...])&nbsp; <br/>方法能以 0 个或 0 以上的数值初始化数组单元。 <br/>属性<br/>length&nbsp; <br/>在数组中单元包含数字的个数。 <br/>方法<br/>无 </p><p>5.13 MFInt32 对象 <br/>MFInt32 对象对应于 VRML 2.0 MFInt32 域。它被用来存储 SFInt32 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 0 。&nbsp; </p><p>创建方法<br/>mfInt32ObjectName = new MFInt32([number, number, ...])&nbsp; <br/>方法能以 0 个或 0 以上的数值初始化数组单元。 <br/>属性<br/>length&nbsp; <br/>数组中元素个数的整数值,通过给length赋值可改变数组中元素的个数。 <br/>方法<br/>无 </p><p>5.14 MFNode 对象<br/>MFNode 对象对应于 VRML 2.0 MFNode 域。它被用来存储 SFNode 对象的一个一维数组。数组中的单个单元能使用标准的 C 语法对其操作 ( 例如 mfInt32ObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数 )。所有的单元的初始默认值为 NULL。&nbsp; </p><p>创建方法<br/>mfNodeObjectName = new MFNode([SFNode, SFNode, ...])&nbsp; <br/>方法能以 0 个或 0 以上的 SFNode 值初始化数组单元。&nbsp; <br/>属性<br/>length&nbsp; <br/>数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.&nbsp; <br/>方法<br/>无 </p><p>5.15 MFRotation 对象<br/>MFRotation 对象对应于 VRML 2.0 MFRotation 域。用来存储 SFRotation 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfRotationObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFRotation ( 0 , 0 , 1 , 0 ) 。&nbsp; </p><p>创建方法<br/>mfRotationObjectName = new MFRotation([SFRotation, SFRotation, ...])&nbsp; <br/>此创建方法可用0个或多个SFRotation值对数组进行初始化。 <br/>属性<br/>length&nbsp; <br/>数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.&nbsp; <br/>方法<br/>无 </p><p>5.16 MFString Object<br/>对象 MFString 对象对应于 VRML 2.0 MFString 域。用来存储字符串对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfStringObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为空字符串</p><p>创建方法<br/>mfStringObjectName = new MFString[string, string, ...])&nbsp; <br/>此创建方法可用0个或多个SFString值对数组进行初始化。 <br/>属性<br/>length&nbsp; <br/>数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.&nbsp; <br/>方法<br/>无 </p>

该用户从未签到

升级  30.8%

9
 楼主| 发表于 2006-4-24 08:41:44 | 只看该作者
<p>5.17 MFVec2f 对象<br/>MFVec2f 对象对应于 VRML 2.0 MFVec2f 域。用来存储 SFVec2f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用&nbsp; ( 例如 mfVec2fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec2f ( 0 , 0 ) 。 </p><p>创建方法<br/>mfVec2fObjectName = new MFVec2f([SFVec2f, SFVec2f, ...])&nbsp; <br/>此创建方法可用0个或多个SFVec2f值对数组进行初始化。 <br/>属性<br/>length&nbsp; <br/>数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.&nbsp; <br/>方法<br/>无 </p><p>5.18 MFVec3f 对象<br/>MFVec3f 对象对应于 VRML 2.0 MFVec3f 域。它是被用来存储 SFVec3f 对象的一个一维数组。数组的单个的单元能使用标准的 C 风格操作符来引用 ( 例如 mfVec3fObjectName [ 索引 ], 在此索引值是大于等于0,小于数组长度的整数。所有的单元的初始默认值为 SFVec3f ( 0 , 0 , 0 ) 。&nbsp; </p><p>创建方法<br/>mfVec3fObjectName = new MFVec3f([SFVec3f, SFVec3f, ...])&nbsp; <br/>此创建方法可用0个或多个SFVec3f值对数组进行初始化。 <br/>属性<br/>length&nbsp; <br/>数组中元素的个数的整数值,通过给length赋值可改变数组中元素的个数.&nbsp; <br/>方法<br/>无 </p><p>5.19 VrmlMatrix 对象<br/>VrmlMatrix 对象在 4x4 矩阵上施行操作提供了许多有效的方法。矩阵的每个元素可使用 C 风格的数组形式访问( 即, vrmlMatrixObjectName [ 0 ][ 1 ] 是在 0 行, 1 列的元素) 。 </p><p>创建方法<br/>vrmlMatrixObjectName = new VrmlMatrix(f11, f12, f13, f14, f21, f22, f23, f24, f31, f32, f33, f34, f41, f42, f43, f44)&nbsp; <br/>产生一个新的矩阵,通过f11 到 f44对矩阵初始化。 <br/>vrmlMatrixObjectName = new VrmlMatrix()&nbsp; <br/>产生一个新的同一矩阵 <br/>属性<br/>无&nbsp; <br/>方法<br/>setTransform(translation, rotation, scaleFactor, scaleOrientation, center)&nbsp; <br/>设置 VrmlMatrix 值。translation 是一个 SFVec3f 对象, rotation 是一个 SFRotation 对象, scaleFactor 是一个 SFVec3f 对象, scaleOrientation 是一个 SFRotation 对象,center 是一 SFVec3f 对象。任何最右边的参数可以被省略。换句话说, 方法可以取 0 ~ 5 个参数。例如, 你能指定0个参数 ( 一个单位矩阵 ), 1个参数 ( 一个 translation ), 2个参数 ( 一个 translation 和 rotation ), 3个参数 ( 一个 translation, rotation 和一个 scaleFactor) 。 <br/>getTransform(translation, rotation, scaleFactor)&nbsp; <br/>分解 VrmlMatrix 并且返回对象的 translation, rotation, 和 scaleFactor 部件。参数的类型与在 setTransform 一样。矩阵的其他信息被忽略。 <br/>inverse()&nbsp; <br/>返回值是对象逆矩阵的 VrmlMatrix 。&nbsp; <br/>transpose()&nbsp; <br/>返回值是对象转制矩阵的 VrmlMatrix 。 <br/>multLeft()&nbsp; <br/>返回值是对象矩阵左乘积的 VrmlMatrix 。 <br/>multRight(matrix)&nbsp; <br/>返回值是对象矩阵右乘积的 VrmlMatrix 。 <br/>multVecMatrix(vec)&nbsp; <br/>返回值是行矢量乘积的 SFVec3f 。 <br/>multMatrixVec(vec)&nbsp; <br/>返回值是列矢量乘积的 SFVec3f 。 <br/> </p><p></p>

该用户从未签到

升级  30.8%

10
 楼主| 发表于 2006-4-24 08:42:14 | 只看该作者
<p>我们以“旋转几何体”为例子,讲解一下VRML与JAVA的接口技术。由于VRML只有方体、圆锥体、圆柱体、球等几种基本的形体,因而,要建立复杂的几何体,只能利用基本形体重叠的方式来建立。本例子演示的效果是一个菱形绕着它的中心轴旋转一周,因此,我们采用JAVA动态生成的方式来制作。每生成一个菱形就绕着中心轴旋转 1 度,循环180次(一周)就可以达到我们所要求的效果了。下面是VRML文件的代码,十分简单。 <br/>#VRML V2.0 utf8</p><p>Background {skyColor 1 1 1}<br/>DEF OBJ Transform {<br/>  children [<br/>    DEF TS TouchSensor {}<br/>    DEF shape Transform {<br/>          rotation 0 0 1 0.785398<br/>          children [<br/>            Shape {<br/>              appearance Appearance {<br/>                material Material {<br/>                  diffuseColor 0.5 0.2 0.7<br/>                }<br/>              }<br/>              geometry Box {size 5 5 0.2}<br/>            }<br/>          ]<br/>    }<br/>  ]<br/>}<br/>DEF Rot Script{<br/>    url "Rotation.class"<br/>    eventIn SFBool touched<br/>    eventOut MFNode RotIt<br/>}</p><p>ROUTE TS.isActive TO Rot.touched<br/>ROUTE Rot.RotIt TO OBJ.addChildren</p><p>  利用URL连接“Rotation.class”,变量touched作为事件的传入口,变量RotIt作为事件的出口。当接触传感器TS检测到鼠标被按下后,“ROUTE TS.isActive TO Rot.touched”使touched的值变为真。下面的JAVA程序被加载执行。 <br/>//Rotation.java<br/>import java.util.*;<br/>import vrml.*;<br/>import vrml.node.*;<br/>import vrml.field.*;<br/>//线程接口 <br/>public class Rotation extends Script implements Runnable{<br/>  MFNode RotIt;<br/>  int k;<br/>  float R=1.0f;<br/>  Thread clockThread =null;<br/>//初始化,取得RotIt的值 <br/>  public void initialize(){<br/>    RotIt = (MFNode)getEventOut("RotIt");<br/>  }<br/>  //生成新的线程,循环180次<br/>  public void run(){<br/>    for(k=0;k&lt;181;k++){<br/>      R=(float)k/180*3.1415926f;<br/>      rotation();<br/>        try{Thread.sleep(10);} //暂停10毫秒<br/>          catch(InterruptedException e){}<br/>        }<br/>    }<br/>  //开始线程 <br/>  public void start(){<br/>    if(clockThread ==null){<br/>      clockThread =new Thread(this);<br/>      clockThread.start();<br/>    }<br/>  }<br/>  //停止线程 <br/>  public void stop(){<br/>    try{<br/>      clockThread.stop();<br/>      clockThread = null;<br/>    }catch (Exception e){}<br/>  }</p><p><br/>  //动态增加节点<br/>  public void rotation() {<br/>      String Rotation1 =<br/>        "Transform {" +<br/>        "  rotation 0 1 0 ";<br/>      String Rotation2 =<br/>        "  children [" +<br/>        "Transform {" +<br/>        "  rotation 0 0 1 0.785398" +<br/>        "  children [" +<br/>        "    Shape {" + <br/>        "      appearance Appearance {" +<br/>        "        material Material {" +<br/>        "          diffuseColor 0.5 0.2 0.7" +<br/>        "        }" +<br/>        "      }" +<br/>        "      geometry Box {size 5 5 0.2}" +<br/>        "    }" +<br/>        "  ]" +<br/>        "}]" +<br/>        "}";<br/>      //取得VRML浏览器的句柄,产生一个新的节点<br/>      Browser browser = getBrowser();<br/>      BaseNode baseNodes[];<br/>      //利用createVrmlFromString接口函数生成新的形体并检测异常<br/>      try{<br/>        baseNodes = browser.createVrmlFromString(Rotation1 + R +<br/>                             Rotation2); <br/>        //设置新的RotTt值并传送回VRML中<br/>        if(null != baseNodes) {<br/>          RotIt.setValue(baseNodes);<br/>        }<br/>      } catch (Exception ex) {<br/>        ex.printStackTrace() ;<br/>      }<br/>      <br/>    }<br/> //接收事件,取得touched变量的值<br/>  public void processEvent(Event ev) {<br/>   if(ev.getName().equals("touched")){<br/>    start();<br/>    }<br/>  }<br/>} <br/>  VRML接收到JAVA传回的值后触发OBJ节点新增加一个子节点,从而形成我们所看到的效果。</p>
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

小黑屋|手机版|Archiver|信息系统项目管理师_软考交流平台. ( 鄂ICP备11002878号-1  公安备案号:42011102001150

GMT+8, 2025-7-5 20:02

Software by Discuz! X3.2

© 2001-2013 SKIN BY DSVUE

快速回复 返回顶部 返回列表