荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: icefire (s....sigh), 信区: Java
标  题: VRML新书消息(目录及第四章)
发信站: BBS 荔园晨风站 (Wed Apr  7 02:09:51 1999), 站内信件 (WWW POST)

发信人: vrml (3d), 信区: Java
标  题: VRML新书消息(目录及第四章)
发信站: BBS 水木清华站 (Wed Apr  7 09:37:24 1999)


######################  书      讯 ############################
书名: VRML2.0交互式三维图形编程  由汕头大学出版社出版  张杰编著
特殊购书方式:
1。作者售书
1。网上订购(email address: jzhang@mailserv.stu.edu.cn)
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 {
p://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

--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 210.39.0.243]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店