网上虚拟空间建造者VRML(初级

内容:

一、VRML是什么
二、有哪些VRML的浏览器
三、VRML文件的组成部分和文件头
四、几个基本造型
五、文本造型
六、造型定位(平移、旋转和缩放)
七、使用材料控制外观
八、Group节点和DEF、USE语法


一、VRML是什么

    VRML是虚拟现实造型语言 (Virtual Reality Modeling Language) 的简称。 它使得全球信息网 (Web) 上能够传送3D的信息。使用它,你能在Internet上设计自己的三维虚拟空间。可以建造虚拟的房间、建筑物、城市、山脉和星球。你能用虚拟的家具、汽车、人员、飞机或你能想象的任何东西来填充虚拟的世界。有了它,唯一限制的就是你的想像力。  VRML能让你在Internet上创建动态的世界和感觉丰富的虚拟幻境,还包括以下能力:

  • 动画空间里的物体,使它运动。
  • 在你的空间里播放声音和影象。
  • 允许使用者和你在空间进行交互。
  • 使用脚本来控制、改进你的空间,脚本是你创建来在VRML空间里实现动作的小程序。

(返回页首)

二、有哪些VRML浏览器

CosmoPlayer
 由SGI公司(http://vrml.sgi.com/cosmoplayer/)所开发,可以支援Netscape( 2.0版本以上)与IE(3.0版 以 上), 是目前浏览VRML2.0最普遍的浏览程式,安装后会取代已经安装的其他VRML浏览程式(包含Netscape内建的Live 3D),强调的特点为其顺畅的浏览功能,不会产生跳动的感觉,安装时会加入Intel所开发的RSX(Rea-listic Sound Experience)2.0版本,以支援VRML中的音效,不过初使用时,它用以浏览的工具较难以接受与理解,不像Live 3D般直觉。现在的Netscape 4.x和IE4.0都内带CosmoPlayer 1.0。

Liquid Reality
 由DimensionX公司(http://www.dnx.com/ products/lr/index.html)所发展的浏览器,强调能与JAVA语言完全结合,并且包含一些不在VRML 2.0中出现的新节点功能,其特色在於VRML 2.0行为功能的表现与互动上,目前最新的版本仅支援Netscape 2.X(不包含3.X版本)。

Community Place VRML 2.0 Browser
 由日本Sony(http://sonypic.com/vs/)公司依据其原来支援VRML 1.0与自订的VRML延伸格式(Extension-VRML)升级而来,为Netscape(2.0以上版本)的外挂程式(Plug-In),不仅支援VRML2.0版,最大的特点在於只要进入由Community Place Bureau所建立的伺服网站中,即可以支援多重使用者功能,赋予一个虚拟的化身,在虚拟空间中进行对谈与互动。

(返回页首)

三、VRML文件的组成部分和文件头

    VRML文本的文件名后缀是 .wrl,这是一种ASCII文本文件。VRML文件可以包括四个主要成分:

  • VRML文件头
  • 原型
  • 造型和脚本
  • 路由

  每个文件都有一个文件头,VRML1.0的文件头和2.0的文件头是不一样的。VRML 1.0的文件头是#VRML V1.0 asciiVRML 2.0的文件头是,我们这里只讨论VRML 2.0#VRML V2.0 utf8  在VRML文件中可以加入注解,只要在注解前加入#即可。下面是一个简单的VRML文件,它在三维空间中建立一个立方体。#VRML V2.0 utf8
Shape {
  appearance Appearance { }
  material Material { }
  }
  geometry Box { }
}

(返回页首)

四、几个基本造型

所有VRML造型都使用Shape节点创建。

Shape节点的语法是Shape {
  appearance NULL
  geometry NULL
}
其中appearance域的值定义一个节点,该节点定义造型的外观,包括颜色和表面纹理等。当它为NULL值时建立的造型是无纹理的白色有阴影物体。它将在后面介绍。geometry域的值定义一个节点,该节点定义造型的3D构造及几何结构。典型的几何结构有Box,Cone,Cylinder和Sphere,它们都可以作为geometry的值。

Box节点的语法是Box {
  size 2.0 2.0 2.0   #长  高  宽(x y z 三个方向,注:2.0   2.0  2.0是缺省值,下同)
}

Cone节点的语法是Cone {
  bottomRadius 1.0   # 圆锥底部半径
  height       2.0   # 圆锥的高
  side         TRUE  # 是否创建圆锥的锥面
  bottom       TRUE  # 是否创建圆锥的底
}

Cylinder节点语法Cylinder {
  radius    1.0   # 园柱底的半径
  height    2.0   # 园柱高
  side      TRUE  # 是否创建园柱曲面
  top       TRUE  # 是否创建园柱顶
  bottom    TRUE  # 是否创建园柱底
}

Sphere节点语法Sphere {
  radius   1.0  # 球体的半径
}
以上语法中的值,是缺省值,下同。下面是一个简单的VRML文件,它创建一个白色的,无纹理的长、高、宽分别为2.2,1.0和1.5的长方体。#VRML V2.0 utf8
Shape {
  appearance Appearance {
    material Material { } # 白色无纹理的物体(material是appearance中的一个属性,我们以后接触)
  }
  geometry Box { size 2.2 3.0 1.5 } # 长方体
}请看效果
(返回页首)

五、文本造型

Text节点语法(作为geometry的值)Text {    
    string      []          #文本内容
    length  0.0              #文本长度
    maxExtent  0.0     #文本的最大长度
    fontStyle  NULL  #文本外观特性
}

FontStyle节点语法FontStyle {
    family      "SERIF"        #指定字符集
    style        "PLAIN"         #文本风格
    size       1.0               #字符高度
    spacing     1.0                #指定VRML单位的水平文本的垂直间距和垂直文本的水平间距
    justify      "BEGIN"     #相对于X、Y来说,文本造型放置的位置
    horizontal   TRUE         #水平文本还是垂直文本
    leftToRight   TRUE      #水平文本是从左到右还是从右往左(X方向)
    topToBottom   TRUE      #垂直文本是从上到下还是下到上
    language         ""          #指定TEXT节点中string所用语言的前后文
}
     文本风格style的值包括“PLAIN(常用文本)”、“BOLD(黑体文本)”、“ITALIC(倾斜文本)”和“BOLDITALIC(黑体且倾斜的文本)”。
    justify的值有四个“FIRST”、“BEGIN”、“MIDDLE”和“END”,justify可以取一个值,也可以取两个值。当取两个值时,两个值应放在方括号中,用逗号隔开。其中第一个为主对齐,第二个为次对齐。需要说明的是对齐的具体含义和lefttorigh和toptobottom的取值有关。具体见下面的表:
表5.1水平文本主对齐的justify域值

justify域的主对齐值 leftToRight域值 描           述
“FIRST” TRUE 将文本块的左边放在Y轴上
FALSE 将文本块的右边放在Y轴上
“BEGIN” TRUE 将文本块的左边放在Y轴上
FALSE 将文本块的右边放在Y轴上
“MIDDLE” TRUE 将文本块的中边放在Y轴上
FALSE 将文本块的中边放在Y轴上
“END” TRUE 将文本块的右边放在Y轴上
FALSE 将文本块的左边放在Y轴上
表5.2垂直文本主对齐的justify域值
justify域的主对齐值 topToBottom域值 描           述
“FIRST” TRUE 将文本块的上边放在X轴上
FALSE 将文本块的下边放在X轴上
“BEGIN” TRUE 将文本块的上边放在X轴上
FALSE 将文本块的下边放在X轴上
“MIDDLE” TRUE 将文本块的中边放在X轴上
FALSE 将文本块的中边放在X轴上
“END” TRUE 将文本块的下边放在X轴上
FALSE 将文本块的上边放在X轴上
 表5.3水平文本次对齐的justify域值
justify域的主对齐值 topToBottom域值 描           述
“FIRST” TRUE 将第一行文本的基线放在X轴
FALSE 将第一行文本的基线放在X轴
“BEGIN” TRUE 将第一行文本的上边放在X轴
FALSE 将第一行文本的下边放在X轴
“MIDDLE” TRUE 将文本块的中点放在X轴
FALSE 将文本块的中点放在X轴
“END” TRUE 将最后一行文本的下边放在X轴
FALSE 将最后一行文本的上边放在X轴
表5.4垂直文本次对齐的justify域值
justify域的主对齐值 leftToRight域值 描           述
“FIRST” TRUE 将第一列文本的基线放在Y轴
FALSE 将第一列文本的基线放在Y轴
“BEGIN” TRUE 将第一列文本的左边放在Y轴
FALSE 将第一列文本的右边放在Y轴
“MIDDLE” TRUE 将文本块的中点放在Y轴
FALSE 将文本块的中点放在Y轴
“END” TRUE 将最后一列文本的右边放在Y轴
FALSE 将最后一列文本的左边放在Y轴

例子:#VRML V2.0 utf8
Shape {
  appearance Appearance {
    material Material { } # 白色无纹理的物体(material是appearance中的一个属性,我们以后接触)
  }
  geometry Text {
     string ["Hello","Let's go!"]
     fontStyle FontStyle {
         spacing  1.1
      }
  }
}
请看效果

(返回页首)

六、造型定位(平移、旋转和缩放)

Transform节点语法Transform {
   children       []                              # 所包含的子节点列表
   translation  0.0    0.0    0.0               # x,y,z方向上平移的值
   rotation           0.0   0.0   1.0    0.0      # x,y,z方向旋转轴标识,旋转角度(用弧度表示)
   scale        1.0    1.0      1.0                     # x,y,z方向的缩放因子
   scaleOrientation   0.0  0.0  1.0  0.0       # 在x,y,z方向轴上旋转一定弧度后,在按scale因子缩放
  Center       0.0    0.0    0.0          # 新的旋转或缩放中心点的x,y,z坐标
}
   children域中的值可以是Shape节点,Group节点(后面讲)或另一个Transform节点(即可嵌套)。还有些域我们放到后面讲。

物体的平移
translation的三个值分别表示x,y,z方向上的平移。
例子:
#VRML V2.0 utf8
Transform {
    translation     2.0     3.0      -5.0       # x方向平移2个单位,y方向平移3个方向,z的反方向平移5个单位
  children  [
       Shape  {
          appearance  Appearance {
                material Material{}
      }
            geometry  Cylinder {}
       }
  ]
}

请看效果(红的为x方向平移2个单位,y方向平移3个方向,z的反方向平移5个单位的圆柱体)

物体的旋转 
旋转采用右手法则,rotation域的前三个值的取值为绕X轴旋转(1.0   0.0  0.0);绕Y轴旋转(0.0  1.0  0.0);绕Z轴旋转(0.0   0.0  1.0);第四个数是旋转的角度,用弧度来表示,正数为逆时针旋转,负数为顺时针旋转。
通常情况下,旋转中心是原点,但可以用Center的值来重定义旋转中心点。
例子:

#VRML V2.0 utf8
Transform {
    rotation   1.0    0.0      0.0    0.785   # 绕X轴顺时针旋转45度
  children  [
       Shape  {
          appearance  Appearance {
                material Material{}
      }
            geometry  Cylinder {}
       }
  ]
}

请看效果,红色的为旋转后的圆柱体,白色的为Y轴

物体的缩放
scale的三个值分别是x,y,z方向的缩放因子.scaleOrientation的值指定一条旋转轴和旋转角度,在缩放前先做旋转,缩放后再转回来,所以它只是使缩放方向旋转而不会旋转物体.
例子:

#VRML V2.0 utf8
Transform {
    scale   3.0    0.0    0.5      # 沿X轴放大两倍,Z轴方向缩小0.5倍
  children  [
       Shape  {
          appearance  Appearance {
                material Material{}
      }
            geometry  Cylinder {}
       }
  ]
}

请看一个复杂的旋转过程得到的效果
源代码请看Group节点和DEF、USE语法

(返回页首)

七、使用材料控制外观

RGB颜色
  RGB颜色包含三个浮点值,每一个都在0.0到1.0之间。第一个RGB颜色值代表红色的使用量值,第二个代表绿色的量值,第三个代表兰色量值。0.0表示该种颜色被关闭,1.0表示该种颜色全部打开。

明暗法
 
当光线照在造型上,造型对光的一面亮,背光的一面暗,而侧面就是中等亮度。明暗的对比使你感觉到造型是三维立体的。你可以使用VRML中的照明节点在你所处的环境中增加一些光源,这些节点将在中级教程中介绍。你可以通过使用Material节点来控制表面的明暗度。

发光效果
 
发光造型包括电灯泡、计算机屏幕和霓虹灯等。发光造型都发出自己本身的光。使用Material节点你可以指定一个发光颜色。

透明度
  不透明的造型挡住了光线,而透明的造型可以让光线通过,半透明的造型挡住了部分光线。你可以用Material节点来指定一个造型创建时的透明状态。

Shape节点中的Appearance节点
  在基本造型中我们详细介绍了Shape节点的geometry域,提到了“其中appearance域的值定义一个节点,该节点定义造型的外观,包括颜色和表面纹理等”。
  Appearance节点语法是
Appearance  {
   material        NULL          #定义造型材料属性的节点
   texture          NULL          #(后面介绍)
   textureTransform  NULL        #(后面介绍)

}
其中

Material的节点语法是
Material  {
   diffuseColor  0.8  0.8  0.8          #表示一种材料的RGB颜色

   emmissiveColor   0.0  0.0  0.0       #表示RGB发光色
   transparency      0.0             #表示一个在0.0到1.0之间的透明度因数

   ambientintensity    0.2      #(后面介绍)
   specularColor  0.0 0.0 0.0    #(后面介绍)
   shininess      0.2            #(后面介绍)
}

例1一个旋转了的红色立方体
#VRML V2.0 utf8
Transform{
  rotation 1.0 1.0 0.0 0.635 #绕X轴和Y轴旋转
  children [
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 1.0 0.0 0.0
        } # 红色无纹理的物体
      }
      geometry Box { size 2.2 3.0 1.5 } # 长方体
    }
  ]
}
请看效果

例2 是多个不同颜色外观的造型
#VRML V2.0 utf8
Group {
  children [
  #Station Shapes
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 1.0 0.0 0.0
        }
      }
      geometry Sphere {}
    },
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 0.5 0.25 1.0
        }
      }
      geometry Cylinder {
        radius 2.0
        height 0.05
      }
    },
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 0.75 0.0 1.0
        }
      }
      geometry Cylinder {
        radius 0.15
        height 5.0
      }
    }
  ]
}

参看效果

例3 本例子共有三个白色质地的灯泡,左边的关闭,中间的发白光,右边的发黄光。

(返回页首)

八、Group节点和DEF、USE语法

Group节点
Group {
   children [ ] #指定包含在组中的字节点列表,典型的子节点是Shape或其他的Group节点
  bboxCenter   0.0  0.0  0.0     #(以后讲)
  bboxSize   -1.0  -1.0  -1.0    #(以后讲)
  addChildren                   #(以后讲)
  removeChildren                #(以后讲)
}

DEF语法
DEF  节点名  节点类型 {……}      #定义节点的名称
节点名可以是任何字母序列,他们是区分大小写的。但注意不要和VRML关键字重复。
节点类型是一种特殊类型的节点,比如Box节点。
例如:DEF MY_BOX  Box {}

USE语法
USE  节点名   #使用已经定义的节点名
在同一文件中你可以使用USE来引用原始节点任意次。
例如:USE MY_BOX
例子:
#VRML V2.0 utf8
Group {
  children [
  #Wing
    DEF Wing Transform {
      scale 0.5 1.0 1.5
      children Shape {
        appearance DEF White Appearance {
          material Material { }
        }
        geometry Cylinder {
          radius 1.0
          height 0.025
        }
      }
    },
  # Fuselage
    DEF Fuselage Transform {
      scale 2.0 0.2 0.5
      children Shape{
        appearance USE White
        geometry Sphere { }
      }
    },
  # Wing detal and fuselage dome
    Transform {
      scale 0.3 2.0 0.75
      children [
        USE Wing
        USE Fuselage
      ]
    }
  ]
}

请看效果请转VRML中级教程

CopyRight © 2003