精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 计算机图形>>JAVA3D学习系列>>VRML新书消息(目录及第四章)

主题:VRML新书消息(目录及第四章)
发信人: vrml()
整理人: funboy(1999-11-24 10:08:05), 站内信件
###################### 书 讯 ############################
书名: VRML2.0交互式三维图形编程  由汕头大学出版社出版  张杰编著
特殊购书方式:
1。作者售书
1。网上订购(email address: [email protected])
2。可以先获书,后汇款(不满意可退书),
   只需将通信地址及邮编告知作者,即可在最短的时间内得到书。
3。书价为25元/本,免收邮购费用。
4。书为16开本,正文161页。
5. 购书有发票。
6. 如果需要书中的源程序,我可以email一个打包程序
  (里面含有书中所有的程序)。
7. 书的简单目录

第一章 VRML的基础知识
第二章 基本形体的生成
第三章 复杂形体的生成
第四章 组节点
第五章  路由(ROUTE)的应用、四个捆绑型节点、WorldInfo节点
第六章  内插器节点
第七章  传感器节点
第八章 材质与光源
第九章 多媒体效果的生成
第十章 特殊的组节点Inline、LOD、Switch
第十一章  用PROTO、EXTERNPROTE语句定义新的节点
第十二章  JavaScript语言基础
第十三章  JavaScript语言在VRML程序中的应用(一)
第十四章  JavaScript语言在VRML程序中的应用(二)
第十五章  VRML、JAVA3D、Chromeffects及未来的三维图形技术
附录A:网络上与VRML有关的站点介绍
附录B:VRML在主页中的应用方法介绍
##############################################################

第四章 组节点



    VRML2.0有一类节点,通常把它们称为组节点,包括:Transform、
Group、Anchor、Billboard、Collision。这些组节点(Grouping Nodes)
具有以下特点:自身称为父节点,并且都有一个children字段,可以
在children里面设置多个节点,children里面设置的节点称为子节点,
父节点可能是另一各组节点的子节点,子节点(如果是组节点的话)也
可能是其它节点的父节点。每个组节点都可以定义一个局部坐标系,这
意味着最底层节点的坐标可能需要多个局部坐标系进行多次坐标变换。
另外,如果一个节点没有父节点,那么这个节点称为根节点。
    注意,只有一些节点能作为子节点,有一些节点不能作为子节点,
详细的规定可从国际标准中得知。
    另外,Inline、LOD、Switch三个节点被称为特殊的组节点,我们
将在后面章节中介绍。
    在前面两章里我们介绍了VRML2.0中的基本形体及复杂形体的生成,
VRML2.0除了能够生成这些形体之外,还可以将形体组合在一起,我们
在前面的编程时就已经将多个形体组合在一起了,又如,下面程序显示
的是正四面体与球的组合。
EX4_01:
#VRML V2.0 utf8
  Shape {
      appearance Appearance { material Material { } }
      geometry IndexedFaceSet {
   coord Coordinate {point [1 0 0,0 0 1.732,-1 0 0,
                              0 1.633 0.577]}
   coordIndex [0 3 1 -1,1 3 2 -1,2 3 0 -1,0 1 2 ]
   color Color {color [0 0 1,0 1 0,1 0 0,1 1 0] }
   colorPerVertex FALSE
   colorIndex [0 1 2 3]  }}
  Shape {
      appearance Appearance { material Material 
                         {diffuseColor 1 1 0 } }
      geometry Sphere {radius .5}}
  Background {skyColor 1 1 1}
    我们看到,上面的例子虽然使多个形体共同显示在屏幕上,但相互
之间是独立的,一个形体产生位置的变化并不会影响到其它形体,但我
们常常希望形体之间能够相互影响,例如一个形体的位置移动使其它形
体也能产生同样的移动,这时我们需要利用一个重要的组节点Transform。


一·Transform节点
    Transform节点的定义是:
    Transform {
   eventIn       MFNode    addChildren
   eventIn       MFNode    removeChildren
   exposedField  SFVec3f   center          0 0 0
   exposedField  MFNode    children        []
   exposedField  SFRotation rotation        0 0 1  0
   exposedField  SFVec3f      scale           1 1 1
   exposedField  SFRotation  scaleOrientation   0 0 1  0
   exposedField  SFVec3f      translation      0 0 0
   field         SFVec3f      bboxCenter      0 0 0
   field         SFVec3f      bboxSize        -1 -1 -1
}
    由Transform节点的定义我们可以得知,Transform节点有两个事件
进,八个字段,其中六个字段类型为exposedField,可以在程序运行过
程中改变这些字段的数据。
    下面我们来看一下Transform节点所拥有的事件进eventIn及字段
的作用。
    addChildren、removeChildren这两个事件进(eventIn)可用来
在程序运行过程中增加或减少Transform节点的子节点。
    center字段用来确定Transform节点所定义的局部坐标系原点与其
父节点(或程序)坐标系原点的位移,如果一个Transform节点有center
及rotation两个字段,那么形体将绕center所定义的新的原点旋转。
    children表示Transform节点可以拥有0个或多个子节点。
    rotation定义了Transform的子节点的坐标系的旋转角度。由于
rotation的类型为SFRotation,根据第一章的定义,我们知道,
rotation的头三个数字和局部坐标系的原点的连线定义了一个旋转轴,
第四个数字表示以弧度给出的右手逆时针方向的旋转角度。例如:
      rotation  0 1 0 1.57 表示绕Y轴旋转90°。
      rotation  1 1 1 3.1416 表示绕(0 0 0)和(1 1 1)
                                两点定义的轴旋转180°。
    scale表示在某一方向进行比例放大,例如:
      scale  1 2 0.5   表示沿Y轴方向放大一倍,
                                沿Z轴方向缩小一倍。
    scaleOrientation表示沿着一定的方向进行比例放大,
它可以用来产生形体的剪切效果,不过一般很少使用它,其作用是
在scale之前旋转局部坐标系,scale后再旋转回来。
    translation用来使子节点的坐标系产生位移,这是一个使用频
率最高的一个字段。
    如果Transform节点里有多个字段,它们在运行时的变换次序为
1·translation
2·center
3·rotation
4·scaleRotation
5·scale
6·-scaleRotation
7·-center
    由于平移translation、比例变换scale、旋转rotation相互之
间是独立的操作,因而它们之间的顺序可以任意安排。
    bboxCenter和bboxSize定义了一个可包络Transform所有子节点
的一个长方体的中心及尺寸,bboxSize的缺省值为 -1 -1 -1,表示
让计算机自动计算这个长方体。一般情况下不用管这两个字段。
    Transform节点是一个重要的组节点,它可以构成一个局部坐标
系,利用translation、rotation、scale等字段可以对Transform的
子节点中的形体产生移位、旋转、比例缩放等效果。
    下面的程序将球、立方体及圆锥摆放在一个长方体上,圆锥还
绕X轴旋转了90度。
EX4_02:
#VRML V2.0 utf8
Transform {
  translation 0 -2 0
  children Shape {
    appearance Appearance {material Material 
                          {diffuseColor 0 1 1}}
    geometry Box {size 20 2 10}}}
Transform {
  children[
  Transform{
    translation -6 0 0
    children Shape {
      appearance Appearance {material Material 
                            {diffuseColor 1 0 0}}
      geometry Box {}}}
  Transform{
    children Shape{
      appearance Appearance{material Material 
                           {diffuseColor 0 1 0}}
      geometry Sphere{}}}
  Transform {
    translation 6 0 0
    rotation 1 0 0 1.57
    children Shape{
      appearance Appearance {material Material 
                            {diffuseColor 0 0 1}}
      geometry Cone{}}}
  ]}
 Background {skyColor 1 1 1}
    下面的程序是一个利用Transform的比例变换及平移变换得
到的小丑形象:
EX4_03:
#VRML V2.0 utf8
Transform{
  children[
  Transform {
    scale 1 1.2 1
    children Shape {
      appearance Appearance{material Material 
                           {diffuseColor 1 1 0 }}
      geometry Sphere{}}}
  Transform{
    translation .5 .4 .6
    scale 1 1 2
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 0 0 1}}
      geometry Sphere{radius .2}}}
  Transform {
    translation -.5 .4 .6
    scale 1 1 2
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 0 0 1}}
      geometry Sphere {radius .2}}}
  Transform{
    translation 0 1 0
    scale 1.1 .4 1.1
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 0 0}}
      geometry Cone{}}}
  Transform{
    translation 1 0 0
    scale .2 .4 .2
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 0 1 1}}
      geometry Sphere{}}}
  Transform{
    translation -1 0 0
    scale .2 .4 .2
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 0 1 1}}
      geometry Sphere{}}}
  Transform{
    translation 0 0 1
    scale .2 .4 .2
    rotation 1 0 0 -.5
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 0 0}}
      geometry Sphere{}}}
  Transform{
    translation 0 -.5 .9
    scale .4 .1 .3
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 1 1}}
      geometry Sphere{}}}
       ]}
 Background {skyColor 1 1 1}







7.JPG







图4-1  由基本形体节点组合得到的小丑

    下面的程序通过Transform使立方体产生剪切变形。
EX4_04:
#VRML V2.0 utf8
Transform {
  scale 1 2 1
  children Transform{
    scale 1 1 1
    rotation 1 0 0 .785
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 1 0}}
      geometry Box{}}}}
Background{skyColor 1 1 1}
    下面的程序利用了scaleOrientation,运行结果和上例一
样,也产生了剪切变形。
EX4_05:
#VRML V2.0 utf8
Transform {
  scaleOrientation 1 1 0 1.57
  scale 1 2 1
  children Shape{
    appearance Appearance{material Material
                         {diffuseColor 1 1 0}}
    geometry Box{}}}
Background{skyColor 1 1 1}


二·Group节点
    Group节点的定义是:
    Group {
   eventIn       MFNode  addChildren
   eventIn       MFNode  removeChildren
   exposedField  MFNode  children        []
   field         SFVec3f bboxCenter      0 0 0
   field         SFVec3f bboxSize        -1 -1 -1
          } 
    Group节点的字段及事件可参考Transform节点的内容。   
    Group节点和Transform有相同的地方:它可以把多个形体
组合在一起,但Group节点没有形体几何变换的功能,可以说
Group节点是一个没有几何变换的Transform节点。Group在程序
中的使用主要是为了使文件内的形体有一个合理的组合,方便
复杂文件的阅读及分析。通常程序里有一个Group节点作为一个
根节点放在程序的第二行,并根据需要对形体进行一定的组合。
    下面的程序用Group节点将三个Box组成一组,并在边上
复制了它们。
EX4_06:
#VRML V2.0 utf8
Group{
 children[
  DEF AAA Group{
   children[
    Transform {
      children Shape {
      appearance Appearance{material Material
                           {diffuseColor 1 0 0}}
      geometry Box{size 2 2 6}}}
    Transform {
      translation .5 2.5 2.5
      children Shape{
        appearance Appearance{material Material
                             {diffuseColor 0 1 0}}
        geometry Box{size 2 6 2}}}
   Transform {
     translation 3 5 3
     children Shape {
       appearance Appearance{material Material
                            {diffuseColor 0 0 1}}
       geometry Box{size 6 2 2}}}
             ]}
 Transform {
   translation 10 0 0
   children USE AAA}
    ]}
Background{skyColor 1 1 1}


三·DEF与USE──节点的命名与重复使用
    在后面的程序中,我们将经常会看到类似这样的内容:
DEF AAA Group {
    这里Group是一个节点名,本来,在Group之前是可以
没有任何内容的,但程序为了重复使用Group组中的内容,
利用DEF给这个Group起了一个名称:AAA,并在程序中的其
它地方用USE重复使用了这一组形体。
    VRML2.0中DEF用来给节点命名,任何需要重复使用的
节点都可以用DEF命名,在其它地方用USE使用它,DEF和
USE使用起来非常简单:先用DEF来命名,使用时用USE代
替原先大段的内容。DEF和USE的语法关系是:
DEF <name>  <nodeType> { <body> }
USE <name>
    下面的程序运用了节点的DEF及USE。
EX4_07:
#VRML V2.0 utf8
Group {
 children[
  Transform{
    children Shape {
      appearance DEF A1 Appearance{material Material
                                  {diffuseColor 1 0 0}}
      geometry DEF G1 Box {size 1 2 1}}}
  Transform{
    translation 5 0 0
    children Shape {
      appearance USE A1
      geometry USE G1}}
       ]}
Background {skyColor 1 1 1}


四·Anchor节点
    Anchor节点的定义是:
    Anchor {
   eventIn       MFNode   addChildren
   eventIn       MFNode   removeChildren
   exposedField  MFNode   children       []
   exposedField  SFString  description     "" 
   exposedField  MFString  parameter     []
   exposedField  MFString  url           []
   field         SFVec3f   bboxCenter    0 0 0     
   field         SFVec3f   bboxSize      -1 -1 -1   
    }
    Anchor在英文里是锚的意思。Anchor节点有两个事件进,
六个字段。我们来看一下我们第一次碰到的三个字段:
description、parameter、url。
    description里的文字串可显示在浏览器的显示条上,
例如Netscape4.04就将其显示在屏幕的最下面。当鼠标移
到带有锚节点的形体时,description里的文字串可以提
供运行程序的人员一些有用的提示,告诉他可通过点击这
个形体可以跳到另一个文件或跳到本文件的一个特定的观
察点。
    parameter用来设定Anchor节点的参数。它可用来让
浏览器完成一些特定的任务,例如parameter "target=_new" 
表示让浏览器在调用新程序时保留旧的程序运行窗口,
没有parameter "target=_new"的话浏览器在调用新程序时
将关闭旧的程序运行窗口。
    url为Anchor节点所指向的网络地址,可以是外部文件
或文件内部的某一个观察点。
    Anchor节点有两个主要的作用:
    第一个作用是从一个文件跳到另一个文件去。Anchor附
在某一形体上,并附带有另一文件的地址,当鼠标移到这一
形体上时,鼠标的形状发生改变,点取这一形体时,浏览器
就将调用另一文件,这一文件可以是VRML文件,也可以是
HTML文件或其它浏览器可执行的文件,EX4_08中第一个Anchor
就是起这样作用的。当我们点击Anchor所附的形体时,浏览器
将调用另一个文件,但原来的文件还在那里,不过不是活动窗
口而已。如果我们将parameter "target=_new"这一行去掉,则
浏览器在运行新的文件时会关闭原来的窗口。
    另一个作用是在同一个文件中从一个观察点跳到另一个观
察点,例如跳到一个较好的显示位置,EX4_08中的第二个Anchor
就是起这样作用的。有了这样的作用,我们在浏览三维世界时就
不会迷失方向,一旦迷失了方向,我们可以跳回到一个设定好的
位置及方向。
    调用另一文件时,我们需要确定文件的具体位置,文件可
以在当前目录下,也可以在不同的目录下,甚至可以在网络上
的其它地方。
    在当前目录时,按EX4_08的写法即可调出。
    在其它目录时,给出目录的具体位置,例如在c:\wrl目录时,
url"ex4_03.wrl"应改为
url"file:///c:/wrl/ex4_03.wrl"
    在网络上时,给出具体地址,例如文件的地址为:
    http://www.stu.edu.cn/vrml/1.wrl 的时候,
则url"temp.wrl"应改为url" http://www.stu.edu.cn/vrml/1.wrl"
EX4_08:
#VRML V2.0 utf8
Group{
 children[
  Transform{
    translation 0 -2 0
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 .5 .5}}
      geometry Box{}}}
  Transform{
    translation -3 1.5 0
    children Anchor{
      url"ex4_03.wrl"
      description "ex4_03.wrl"
  parameter "target=_new"
      children Shape{
        appearance Appearance{material Material
                             {diffuseColor 1 0 0}}
  geometry Cylinder{}}}}
  Transform{
    translation 3 1.5 0
    children Anchor{
      url"#Start"
      description"You can return to start viewpoint"
      children Shape{
appearance Appearance{material Material
                             {diffuseColor 0 1 1}}
geometry Cone{}}}}
]}
Background{skyColor 1 1 1}
DEF Start Viewpoint{
  position 0 3 12
  orientation 1 0 0 -.5
  description "Start Viewpoint"}


五·Billboard节点
    Billboard节点的定义如下:
    Billboard {
   eventIn      MFNode    addChildren
   eventIn      MFNode    removeChildren
   exposedField SFVec3f   axisOfRotation  0 1 0     
   exposedField MFNode    children        []
   field        SFVec3f   bboxCenter      0 0 0    
   field        SFVec3f   bboxSize        -1 -1 -1  
              }
    Billboard节点有两个事件进,四个字段,其中只有
axisOfRotation字段我们还没有介绍过,axisOfRotation
可用来设定旋转轴。
    Billboard在英语中的意思是广告牌、招贴栏。
Billboard节点可用来调节局部坐标系的方位,使得局部
坐标系的Z轴随着观察方向的改变而绕Y轴(0 1 0)或
X(1 0 0)轴旋转,并永远指向观察者;当我们设定
axisOfRotation的值为(0 0 0)时,产生一个特例,这时
局部坐标系的Y轴永远朝上,方向不改变,我们称其
为viewer-alignment。
    我们来看一下例子。在EX4_09中,有三个带有
Billboard节点的局部坐标系,浏览时,形体将围绕着
特定的轴旋转,屏幕上的文字更特别:不论观察方向怎
样改变,文字在屏幕上永远处于水平状态,即文字所在的
局部坐标系的Y轴永远朝上。
EX4_09:
#VRML V2.0 utf8
Group{
 children[
  Transform{
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 .5 .5}}
      geometry Box{size 8 .5 6}}}
  Transform{
    translation -2 2 0
    children Billboard{
      axisOfRotation 0 1 0
      children Shape{
        appearance Appearance{
               texture ImageTexture{url"1.jpg"}}
        geometry IndexedFaceSet{
    coord Coordinate{
               point[ -1 -1 0 ,1 -1 0,1 1 0, -1 1 0]}
  coordIndex[0 1 2 3]}}}}
  Transform{
    translation 2 2 0
    children Billboard{
      axisOfRotation 1 0 0
      children Shape{
        appearance Appearance{material Material
               {diffuseColor 1 1 0}}
geometry Cone{}}}}
  Transform{
    translation 2 3.5 0
    children Billboard{
      axisOfRotation 0 0 0
      children Shape{
appearance Appearance{
             material Material{diffuseColor 0.5 1 1}}
     geometry Text{string"Top"}}}}
]}
Background{skyColor 1 1 1}
Viewpoint {
  position 0 3 10
  orientation 1 0 0 -.3}


六·Collision节点
    Collision节点的定义如下:
    Collision{
   eventIn       MFNode   addChildren
   eventIn       MFNode   removeChildren
   exposedField  MFNode   children       []
   exposedField  SFBool   collide        TRUE
   field         SFVec3f  bboxCenter     0 0 0     
   field         SFVec3f  bboxSize       -1 -1 -1  
   field         SFNode   proxy          NULL
   eventOut      SFTime   collideTime
  }
    由Collision节点的定义我们得知:Collision节点
有两个事件进,五个字段,一个事件出。我们来看一下
我们第一次碰到的collide、proxy、collideTime。
    collide可用来设定浏览器是否检查碰撞情况。当
我们运行VRML文件时,观察点经常会碰到形体,如果
collide为TRUE,浏览器将密切注意观察点是否与形体
发生碰撞,如果发生碰撞,则发出一个事件出,可以
用路由ROUTE或编程的方式处理碰撞时发出的事件出。
如果将这一事件通过路由语句(ROUTE)与一声源相连,
当观察点与形体产生碰撞时我们就可以通过声响得知。
    注意,Collision节点只用来判断观察点与形体的
碰撞情况,它不能检测形体与形体之间的碰撞情况。
    collideTime为碰撞时发出的事件出,它的类型
为SFTime,表示collideTime提供的是碰撞时间,不过
要想得到collideTime,必须将collide设为TRUE。
    proxy在英文里意思是代表、代理人,我们可以把
它称为化身,由于它的类型是SFNode,因而我们可以
用它给出一个三维形体节点,定义一个三维的区域。
这一区域我们看不到,但观察点进入这一区域时,
Collision可发出信息使我们得知即将进入某一区域。
    注意,Collision对IndexedLineSet、PointSet、
Text不起作用,因为它们只是二维或一维的形体。
下面的程序利用了三个Collision节点:当观测点碰
到头两个Collision里的形体时,Sound就将发出声响;
当观测点碰到第三个Collision里proxy定义的形体时,
Sound发出另外一种声响,表示观测点进入到了相应区域。
EX4_10:
#VRML V2.0 utf8
Group{
 children[
  Transform{
    translation 0 -1 0
    children Shape{
      appearance Appearance{material Material
                           {diffuseColor 1 1 .5}}
      geometry Box{size 10 1 8}}}
  Transform{
    translation -3 2 3
    children DEF C1 Collision{
      children  Shape{
appearance Appearance{material Material
                             {diffuseColor 0 1 1}}
geometry Box{}}}}
  Transform{
    translation 3 2 3
    children DEF C2 Collision{
      children Shape{
appearance Appearance{material Material
                             {diffuseColor 1 0 1}}
geometry Cylinder{}}}}
  Transform{
    translation 0 6 -8
    children DEF C3 Collision{
      proxy Shape{geometry Sphere{radius 8}}
      children Shape{
appearance Appearance{material Material
                             {diffuseColor 1 1 0}}
geometry Sphere{radius .8}}}}
]}
Group{
 children[ 
  Sound{
    maxBack 30
    minBack 30
    maxFront 30 
    minFront 30
    source DEF AC1 AudioClip{
      description "You have touched the object"
      url"1.wav"}}
  Sound{
    maxBack 30 
    minBack 30 
    maxFront 30
    minFront 30
    source DEF AC2 AudioClip{
      description "You have touched the proxy object"
      url"2.wav"}}
  ]}
Background {skyColor 1 1 1}
Viewpoint {
  position 0 3 15
  orientation 1 0 0 -.4}
ROUTE C1.collideTime TO AC1.startTime
ROUTE C2.collideTime TO AC1.startTime
ROUTE C3.collideTime TO AC2.startTime

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.192.159.19]

[关闭][返回]