VRML是一种语言,使用它,可以在VRML查看器中显示三维对象。本节包括的内容有:[大谦MATLAB,dqmatlab点com]
VRML的历史 VRML97标准出台大事记。
VRML的坐标系统 VRML坐标系统与MATLAB坐标系统有所不同。
VRML的文件格式 VRML文件使用层次结构来描述三维对象。
1 VRML的历史
从开始在互联网上发布文档,人们就试图通过采用高级三维图形并且与这些图形交互来提高网页内容的质量。VRML这个术语是Tim Berners-Lee 1994年在欧洲环球网研讨会上谈论建立三维环球网标准的必要性时提出的。此后很快地,一个由艺术家和工程师组成的活跃团体形成了一个名为www-vrml的邮件发送清单。他们将标准的名称改为虚拟现实模型语言(Virtual Reality Modeling Language,VRML),以此强调图形学的地位。他们努力的结果是形成了VRML 1.0规范。作为该规范的基础,他们使用了SGI公司Inventor文件格式的一个子集。
VRML 1.0标准可以在几种VRML浏览器上执行,但是使用它只能创建静态的虚拟世界。这个局限性使它不能推广使用。显然,这个语言需要添加动画和交互性方面的功能,以便给虚拟世界带来活力。后来VRML 2.0标准开发出来了,并且在1997年被采纳为国际标准ISO/IEC 14772-1:1997,所以又称为VRML97。
VRML97是创建交互式三维场景(虚拟世界)的一个开放灵活的平台。随着计算机计算和绘图能力的飞速提高,以及通信更加快速,三维图形在艺术和游戏等传统领域以外的应用越来越常见了。现在,在几个平台上都可以获得支持VRML97的浏览器。同样,可供选择的VRML生成工具也越来越多。另外,许多传统的图像软件包如CAD等现在也提供VRML97格式的导入和导出功能。
Simulink三维动画模块通过使用VRML97技术,给MATLAB用户提供了一个开放的三维可视化解决方案。它对于VRML97在科学计算和交互式三维动画等领域的广泛应用十分有益。
2 VRML坐标系统
VRML使用右手笛卡儿坐标系统。将右手的大拇指、食指和中指伸直,两两正交,则大拇指表示x轴,食指表示y轴(向上),中指表示z轴。笛卡儿坐标如图1-1所示。
图1-1 MATLAB图形坐标系统 图1-2 VRML坐标系统
如图1-2所示,VRML坐标系统与MATLAB的不同。MATLAB坐标z轴向上为正,y轴向后为正;而VRML坐标z轴向前为正,y轴向上为正。
在VRML中,旋转角度用右手规则进行定义。如图1-3所示,用右手握住一根坐标轴,大拇指指向它的正向。剩下4个手指的指向为逆时针方向。这个方向就是对象旋转的正向。
在VRML文件的层次结构中,子对象的位置和方向相对于父对象进行指定。父对象有它自己的局部空间,该空间根据它的位置和方向定义。移动父对象同样会移动与它有关的子对象。
在VRML中,所有长度和距离以米为单位进行度量,角度单位为弧度。
3 VRML数据类型
VRML数据类型是VRML节点用于定义对象和VRML节点字段数据的数据类型。主要包括下面两个主题:
VRML字段数据类型;
VRML数据类类型。
VRML字段数据类型
表1-1列出了所有VRML数据类型,以及它们与MATLAB类型的转换。
表1-1 VRML数据类型及其与MATLAB类型的对应关系
| VRML类型 | 描 述 | Simulink三维动画模块中的类型 |
|---|---|---|
| SFBool | 布尔值,true或false | 'on'或'off' |
| SFFloat | 32位浮点值 | Double |
| SFInt32 | 32位有符号整型值 SFInt32_value=floor(double_value) | Double |
| SFTime | 绝对或相对时间值 | Double |
| SFVec2f | 有两个浮点值的向量,通常用于表示二维坐标,如纹理坐标 | Double 型数组 (1×2) |
| SFVec3f | 有三个浮点值的向量,通常用于表示三维坐标 | Double型数组(1×3) |
| SFColor | 有三个浮点值的向量,用于指定RGB颜色 | Double型数组(1×3) |
| SFRotation | 有四个浮点值的向量,用于指定坐标轴加上旋转角度的旋转坐标 | Double型数组(1×4) |
| SFImage | 浮点值序列表示的二维数组 | N/A |
| SFString | UTF-8编码的字符串,与ASCII兼容,允许使用统一编码字符 | String |
| SFNode | VRML节点的容器 | N/A |
| MFFloat | 数组,元素为SFFloat值 | Double型数组(n×1) |
| MFInt32 | 数组,元素为SFInt32值 | Double型数组(n×1) |
| MFVec2f | 数组,元素为SFVec2f值 | Double型数组(n×2) |
| MFVec3f | 数组,元素为SFVec3f值 | Double型数组(n×3) |
| MFColor | 数组,元素为SFColor值 | Double型数组(n×3) |
| MFRotation | 数组,元素为SFRotation值 | Double型数组(n×4) |
| MFString | 数组,元素为SFString值 | 字符单元数组 |
| MFNode | 数组,元素为SFNode值 | N/A |
VRML数据类类型
一个节点可以包含4类数据:field, exposedField, eventIn和eventOut。这些类定义节点的行为,节点保存到计算机内存的方式和它们与其他节点和外部对象交互的方式。VRML数据类如表1-2所示。
表1-2 VRML数据类
| VRML数据类 | 描 述 |
|---|---|
| eventIn | 节点可以接受的事件 |
| eventOut | 节点可以发送的事件 |
| field | 私有的节点成员,保存节点数据 |
| exposedField | 公有的节点成员,保存节点数据 |
(1)eventIn
通常,eventIn事件对应于节点中的一个字段。节点字段不是从节点外部获取的,改变它们的惟一方法是存在对应的enentIn。
有些节点的eventIn事件不对应于该节点的任何字段,但是为它提供了额外的函数。例如,Transform节点有一个addChindren eventIn,该事件被接收时,传递的子节点就添加到给定变换子对象的列表中。
(2)eventOut
不管什么时候,当允许发送事件的对应节点字段改变值时,本事件被发送。
(3)field
字段可被发送给VRML文件中的特定值。通常,字段对于节点来说是私有的,它的值只在节点接收一个对应的eventIn时发生改变。重要的是,要理解字段本身不会无缘无故地被其他节点或通过外部生成界面改变。
(4)exposedField
这是一个强大的VRML数据类,有很多用途。它用于同时具有eventIn和eventOut功能的字段类类型。对应eventIn的替代名称总是有set-前缀,对应eventOut的字段名称总是有-changed后缀。
exposedField类定义对应eventIn和eventOut的行为。对于所有的exposedField类,当事件发生时,字段值发生改变,场景也发生相应的改变,eventOut用一个新值进行传递。这样,在许多节点之间就可以发生连锁反应。
4 VRML编辑工具
可以有多种方法创建VRML代码描述的虚拟世界。例如,可以直接用文本编辑器编写VRML代码,或者可以在不必懂得任何VRML语言方面基础知识的情况下用VRML编辑器创建虚拟世界。但是,有必要理解VRML树的结构,以连接虚拟世界和Simulink模块和信号。
5 VRML文件格式
使用VRML生成工具创建虚拟世界不需要任何VRML格式方面的基础知识。但是,了解VRML场景描述方面的基础知识是有益的。这样,可以帮助你更有效地创建虚拟世界,而且对于虚拟世界中的元素是如何通过Simulink三维动画模块进行控制的有更好的理解。
VRML中,一个三维场景用对象(或节点)的树状层次结构进行描述。树中的每一个节点表示场景的某些功能。有54种不同类型的节点,其中有些是形状节点(表示真实的三维对象),有些是组节点,用于聚合它的子节点。比如,下面有几种节点:
Box节点 表示场景中的一个箱形对象。
Transform节点 定义位置、比例、比例方向、旋转、平移和它的子树(组节点)的子对象。
Material节点 对应于场景中的材质。
DirectionalLight节点 表示场景中的光。
Fog节点 表示场景中的雾。
ProximitySensor节点 该节点使得可以与VRML97进行交互。当用户进入指定区域,或者在指定区域中存在或移动时产生事件。
每个节点包含了一列字段,它们的值定义节点的函数参数。
这些节点可以放在树的顶层或作为其他节点的子对象放在树层次中间。改变某节点字段中的值时,它的子树中所有节点都要受到影响。利用这个特点,可以在复杂的组合对象中定义相对位置。
在VRML场景定义语法中使用DEF关键字,可以用指定的名称标注每个节点。例如,语句
DEF MyNodeName Box
将一个Box节点的名称设置为MyNodeName。
下面是一个简单的VRML文件,它建立的一个三维场景,其中有两个图形对象模型:地板上有一个红色的球,地板用展平的Box节点对象表示。注意,VRML是可读的文本文件,可以在任何文本编辑器中进行编辑。
#VRML V2.0 utf8
# This is a comment line
WorldInfo {
title "Bouncing Ball"
}
Viewpoint {
position 0 5 30
description"Side View"
}
DEF Floor Box {
size 6 0.2 6
}
DEF Ball Transform {
translation 0 10 0
children Shape {
appearance Appearance {
material Material {
diffuseColor 1 0 0
}
}
geometry Sphere {
}
}
}
第1行是VRML头行。每个VRML文件必须有这个头行。它说明这是一个VRML 2.0文件,并且文件中的文本对象按照UTF8标准进行编码。用符号#进行注释。除了第1行以外,每个以#符号打头的行都会被VRML查看器忽略。
本例中,大部分属性都设置为默认值,只重新指定了名称和维。为了能控制球的位置和其他属性,它被定义为一个Transform类型节点的子节点。这里,默认的单位圆球指定为红色,位于地板上方10的地方。另外,虚拟世界的标题被VRML查看器用于分辨不同的虚拟世界。VRML文件中还定义了一个合适的初始视点。
这个VRML文件定义的场景如图1-4所示。
图1-4 VRML定义的一个场景