虚拟实境模型语言基础教程及实例

Virtual Reality Modeling Language (VRML) Basic Tutorial with Examples


实例(一〕天地混沌


天地混沌如鸡子,盘古生其中。

此实例乃本大侠初学VRML语言时颇为自负之作。作为第一个例子,它显得难了些。
但按照神话情节的发展,只好把它放在最前面。

想象这样的画面:茫茫广宇似一个硕大的鸡卵,而巨人盘古就在其中孕育。进一步
想象,它远处看是什么样子?它里面是什么样子?巨人的孕育是否要有霹雳闪电的
锻炼?

且看本大侠如何设计此虚拟实境:

(一〕从第一行开始:

#VRML V2.0 utf8 #此指令必须放在第一行。

WorldInfo {  #以下为版权声明 
        title "天地混沌" 
        info [ 
        "Author: 金臂螳螂" 
        "Date: Feb. 28, 1998 (Sat)", 
        ]
}

(二〕设定虚拟实境的动作(navigation〕:

NavigationInfo {  #以下控制虚拟实境的动作 
        type "EXAMINE"  #动作的参数 
        headlight TRUE  #光源控制 
        speed 1.0  #动作的速度 
}

看出些门道来了吧?其中type,headlight以及speed后的参数可以调整。

(三〕为增加闪电效果,先用一幅画来作背景:

Background {  #背景,可规定一到六面 
        frontUrl ["final.jpg"] #前方背景所用图象路径 
        backUrl ["final.jpg"] #后方 
        topUrl ["final.jpg"] #上方 
        bottomUrl ["final.jpg"]  #下方 
        leftUrl ["final.jpg"]  #左方 
        rightUrl ["final.jpg"]  #右方 
}

(四〕为内外几层来浏览这个巨卵,再规定一下视点:

Group {  #组,当虚拟实境中有多个物体(children)时使用
   children [  #组中的单个物体
      DEF EntryView Viewpoint {  #开始视点
	   position 0 0 10  #视点参数
	   description "Middle"  #视点名称,在中层
      },
      DEF Outside Viewpoint {  #外层视点
	   position 0 0 40
	   description "Outside" 
      },
      DEF Inside Viewpoint {  #内层视点
	   position 0 0 3
	   description "Inside"
      }
   ]
}

请注意:开始视点是从中间开始。阁下可在自己练习时把它改成从外或里开始。若
能成功,则阁下离认明庐山真面目已不远了。

(五〕现在来用三个圆心都是零点圆球来体现鸡卵:

Transform {  #规定单个物体特征 
   children [ 
      Shape {  #规定物体外部
	 appearance Appearance {  
	    material Material { emissiveColor 1 0 0 }  #物体颜色 
	    texture ImageTexture {url "01_yy.gif"}  #物体表面粘贴的图象路
	                                            #径,注意:粘贴了图象
                                                    #后,物体颜色将被盖住
       }
       geometry Sphere { }  #(最内层)物体几何形状,球体, 标准直径  
      }
   ]
}
Transform {  
   children [  
      Shape {  
	 appearance Appearance {           
	    material Material {  
	       specularColor 1 1 1  #这两行指令规定了物体的  
	       transparency 0.5	 #颜色及其透明度
	    }
       texture ImageTexture {url "reptile.gif"}  #物体表面粘贴的图象路径,
                                                 #注意:由于物体自身颜色
                                                 #透明,图象有模糊效果
       }
	 geometry Sphere { radius 5 }  #此物体还是个球体,直径为5,比标准
	                               #直径大
      },
      Shape {   
	 appearance Appearance {  
	    material Material {  
	       specularColor 1 1 0   
	       transparency 0.2	 
	    }
	 }
       geometry Sphere { radius 15 } #此物体还是个球体,直径为15,直径最大
      }
   ]
}

(六〕哇!还忘了放入雷声。下面是仅是插入声音的指令,还未规定插入哪里:

Sound {  #规定声音参数
	 direction 0 0 1  #方向
	 intensity 1  #密度 
	 location 0 0 0	#位置
	 maxBack 20	 #后最大
	 maxFront 20  #前最大
	 minBack 5	#后最小
	 minFront 5	 #前最小
	 priority 0	 #优先
	 spatialize TRUE  #形成空间  (立体声)
	 source AudioClip {  #声源
	    loop TRUE  #反复
	    description "Thunder"  #声音名称
	    pitch 1.0  #音量
	    url "thunder.wav"  #声音文件路径
	    startTime 1  #开始时间
	 }
}

(七〕把声音插入到最小的球体里,这样,越往里浏览,声音越响,反之则渐小。
插完后,第(五〕中三个圆球部分的最后指令如下:

Transform {  #规定单个物体特征 
   children [ 
      Shape {  #规定物体外部
	 appearance Appearance {  
	    material Material { emissiveColor 1 0 0 }  #物体颜色 
	    texture ImageTexture {url "01_yy.gif"}  #物体表面粘贴的图象路
	                                            #径,注意:粘贴了图象
                                                    #后,物体颜色将被盖住
       }
       geometry Sphere { }  #(最内层)物体几何形状,球体, 标准直径  
      },

      Sound {  #规定声音参数
	   direction 0 0 1  #方向
	   intensity 1  #密度 
	   location 0 0 0    #位置
	   maxBack 20	 #后最大
	   maxFront 20  #前最大
	   minBack 5	#后最小
	   minFront 5	 #前最小
	   priority 0	 #优先
	   spatialize TRUE  #形成空间  (立体声)
	   source AudioClip {  #声源
	      loop TRUE  #反复
	      description "Thunder"  #声音名称
	      pitch 1.0  #音量
	      url "thunder.wav"  #声音文件路径
	      startTime 1  #开始时间
	   }
      }
   ]
}

Transform {  
   children [  
      Shape {  
	 appearance Appearance {  
	    material Material {  
	       specularColor 1 1 1  #这两行指令规定了物体的  
	       transparency 0.5	 #颜色及其透明度
	    }
       texture ImageTexture {url "reptile.gif"}  #物体表面粘贴的图象路径,
                                                 #注意:由于物体自身颜色
                                                 #透明,图象有模糊效果
       }
	 geometry Sphere { radius 5 }  #此物体还是个球体,直径为5,比标准
	                               #直径大
      },
      Shape {   
	 appearance Appearance {  
	    material Material {  
	       specularColor 1 1 0   
	       transparency 0.2	 
	    }
	 }
       geometry Sphere { radius 15 }  #此物体还是个球体,直径为15,直径最大
      }
   ]
}

(八〕至此,阁下已练到八步螳螂拳法:-))此时,将所有红色指令按其出现的顺序
剪切到一个文件里作为源码,再存为*.wrl文件,如a_Dragon.wrl。但在浏览此虚拟
实境前,还需下载如下文件:

final.jpg : 兰色的闪电,像一只硕大无朋的巨爪攫向人圜
01_yy.gif : 龙马从渭水里驮出来的八卦图
reptile.gif : 从北海九龙壁上飞来的金龙
thunder.wav : 来自远古的神圣肃穆的雷声

并放在与a_Dragon.wrl相同的文件夹里。

最后,浏览此 a_Dragon.wrl 虚拟实境,并逐一对照核实源码中所言效果,以知其所
以然。

值得提醒的是:虚拟实境的下载较其它文件要慢。在以上的实例中,一定
要等背景及表面粘贴文件,以及声音文件都下载好以后,再开始浏览。

练习题:
阅读并理解此虚拟实境之源码,修改源码,取消虚拟实境中的闪电背境及雷声。假
如阁下有更好的图案, 则不妨用作背景试试。

下一个实例中,盘古已推开天地,阴阳初判矣。

页眉

主页