虚拟现实VRML简明教程
第六节 扩充节点类型

  本教程创建了六个典型VRML境界,介绍了VRML的主要功能。这些例子的侧重点在于VRML的交互式特征,而不是营造境界的造型特征,后者可参见一般的三维图形工具,把这二者结合起来,可以创建更加精彩的交互式3D境界。

  本章根据需要介绍了部分VRML节点的基本用法,以后将对VRML节点进行分类和较为全面的评论。 当然,VRML功能十分丰富,要成为VRML专家,一方面需要研读VRML97标准,以求全面深入的掌握和应用,另一方面,要经常研读成功的作品,获取创作灵感。

第七节 结束语

 

  接口声明之后是原型的主体,称为原型定义。原型定义实际上是一个场景图,由一个或多个根节点、嵌入的PROTO语句和ROUTE语句构成,其中的第一个节点类型确定原型实例在VRML文件中的使用方法。例如,如果原型定义中的第一个节点是Material节点,则只要可以使用Material节点的地方,原型实例都可以使用。原型定义中定义的其它节点及其附带的场景图都不进入原型实例所在的变换层系,但可以被原型定义中的ROUTE语句或Script节点引用。TwoColorTable原型中的第一个节点是Transform组节点,它决定了TwoColorTable型节点在场景图中的方法,在场景图中添加一个TwoColorTable型节点,相当于增加Transform.

  原型定义中节点的域、入事件、出事件可以通过IS语句和接口声明中的域、入事件、出事件建立关联,关联实际上相当于把原型定义中的这些域和事件公开作为原型的域和事件。关联的基本规则是域和域、入事件和入事件、出事件和出事件对应关联,原型定义中的外露域可以和接口声明中的域、入事件、出事件或外露域关联。本例中的关联有两个:桌面diffuseColor 域和接口声明中的topColor域,桌腿的diffuseColor域和接口声明中的legColor域之间。也就是说,TwoColorTable型节点中的topColor和legColor值实际上分别确定了桌面和桌腿的漫反射色diffuseColor.

  原型语句PROTO分为原型接口声明和原型定义两部分、接口声明包括原型的入事件和出事件的类型和名称,以及原型的域的类型、名称和缺省值。这里的接口声明为:


  PROTO TwoColorTable [
     field SFColor legColor 0.8 0.4 0.7
     field SFColor topColor 0.6 0.6 0.1
     ]

  这个原型的类型名称为“TwoColorTable"(双色桌),它有两个域:legColor(桌腿色)和topColor(桌面色)。作为节点类型,TwoColorTable的用法和其它内部节点类型一样,例如下面的语句定义一个TwoColorTable类型的节点,它的桌腿为红色,桌面为绿色:

  TwoColor Table {
     legColor 1 0 0
     topColor 0 1 0
     }


#VRML V2.0 utf8
PROTO TwoColorTable [
 field SFColor legColor 0.8 0.4 0.7
 field SFColor topColor 0.6 0.6 0.1
  ]{
  Transform {
    children [
     Transform { #桌面
      translation 0.0 0.6 0.0
      children [
       Transform {
         appearance Appearance {
           material Material {
             diffuseColor IS topColor
             }
           }
         geometry Box {
           size 1.2 0.2 1.2
           }
         }
       ]
       }

     Transform { #一条桌腿
       translation -0.5 0 -0.5
       children [
         DEF Leg Shape {
           appearance Appearance {
             diffuseColor IS legColor
             }
           }
         geometry Cylinder {
           height 1
           radius 0.1
           }
         ]
       }

     Transform { #另一条桌腿
       translation 0.5 0 -0.5
       children USE Leg
       }
     Transform { #另一条桌腿
       translation -0.5 0 0.5
       children USE Leg
       }
     Transform { #另一条桌腿
       translation 0.5 0 0.5
       children USE Leg
       }
     ]#根节点Transform的儿子结束
    }#根Transform 结束
   }#原型结束
  VRML提供了54种节点类型,称为内部节点类型。然而实际应用种可能要求新的节点类型,原型(prototype)是VRML实现节点类型扩充的基本机制。新节点类型是根据已定义的(内部的或原型的)节点类型定义的,一旦定义,原型节点类型就可以象内部节点类型一样在场景图中实例化。原型可以在当前文件中定义并使用,也可以在其它文件中定义,即外部原型,外部原型提供了一种使节点类型能够跨越网络的机制。本节的原型例子取自VRML97标准,它定义的是一个桌子类型,这个原型为: