分类:
2009-09-04 11:18:58
VRML 定义了一组能描述 3 维图形的对象 - 节点 (node) 节点被安排成层次结构 - 场景图 (scene graph) 场景图定义了节点的顺序 - 场景图的状态依赖于早期节点并影响着后来的节点 分隔符 (separator) 的应用可以使一部分场景与其他部分相互独立 节点的特性由下列信息决定 对象类型 : 立方体 (cube) 、球 (sphere) 、纹理映射 (texture map) 、变换 (transformation) 等 描述此对象的参数 此对象的可选名字 对某些类型的节点 - 组节点 (group node) - 可以描述其下的子节点 (child node) 实例 I - 外形 外形节点 (Shape nodes) 如 Cube 、 Sphere 等定义了场景中对象的几何外形 实例 II - 特性 材质节点 (material node) 定义了后续所有外形的表面材质特性 实例 III - 组节点 分隔符节点 (separator node) 将他的 " 儿子 (children)" 与场景图中的其他部分分隔开来 实例 IV - 纹理 纹理节点 (texture node) 定义了作用于后续外形的纹理映射 VRML域的说明 有两类常见的域,一类只包含单值(所谓单值,可以是一个单独的数,也可以是定义一个向量或颜色的几个数,甚至可以是定义一幅图像的一组数)另外一类包含多个单值。单值类型的域,名称以“SF”开始;多值类型的域,名称以“MF”开始。 在VRML文件中,表示多值域的方法是:一系列用逗号和空格间隔开的单值,整个用方括号括起来。如果一个多值域,不包含任何值,则只标出方括号(“[]”),其中不填任何数。如果一个多值域,恰好只包含一个数,可以不写括号,直接写该值。例如,可以表示一个多值域,其中只包含一个单独的整数1,下列两种方式均属有效: 1 [1] 本说明依次介绍两种域的值。单值类型的域按英文字母的顺序给出;多值域按相应的单值域配合列出。事件的类型与域的类型是完全一致的。每一个事件类型都具有一个相关的初始值,在类型描述中有所规定。当脚本试图读取一个尚未发送的输出事件的数值时,该初始值被返回。 SFBool 一个SFBool域只含有一个Bool值。TRUE和FALSE(不带引号也不带任何标点符号)是SFBool域仅有的两个有效值。 SFBool输出事件的初始值是FALSE。 注意:一般的程序设计重用1和0表示True和False值,在VRML中不允许。 SFColor和MFColor SFColor域是只有一个颜色值的单值域。SFColor值和RGB值一样,由一组三个浮点数组成。每个数都是从0.0--1.0,极值包括在内,分别表示构成颜色的红绿蓝三个分量。 MFColor域是一个多值域,包含任意数量的RGB颜色值。例如: [ 1.0 0.0 0.0,0 1 0,0 0 1] 表示三种颜色红绿蓝的组成。 SFColor域的输出事件的初始值是(0,0,0)。而MFColor域的输出事件的初始值是[]。 SFFloat和MFFloat 一个SFFloat域含有一个ANSI C格式的单精度浮点数。 一个MFFloat域含有零个或多个ANSI C格式的单精度浮点数。即允许空白,不赋任何值。 SFFloat域输出事件的初始值为0.0。MFFloat域输出事件的初始值为[]。 SFImage 一个SFImage域含有非压缩的二维彩色图像或灰度图像。 一个SFImage域,首先列出三个整数值,前两个表示图片的宽度和高度,第三个整数表示构成图像格式的元素个数(1--4),随后,按(宽度x高度)的格式列出一组16进制数,数与数之间以空格分隔,每一个16进制数表示图像中一个单独的像素。 图像格式的元素个数表示这张图像是灰度图还是彩色图,以及是否包括透明像素或半透明像素。 单元素图像中的每一个像素用一个16进制的字节表示,所表示的是一个像素的亮度。例如:0XFF表示最高亮度(白色),而0X00表示最低亮度(黑色)。 双元素图像用两个字节表示一个像素。第一个字节表示亮度,第二个字节表示透明度。表示透明度时,字节为0xFF表示完全透明,而0x00表示不透明。所以0x40C0表示1/4亮度(暗灰)和3/4透明度。 三元素图像的每个像素有三个字节表示,每个字节表示像素颜色中红绿蓝分量(所以0xFF0000表示红色)。 四元素图像是在红绿蓝三色的值之外再加一个表示透明度的字节(所以0x0000FF80表示办透明的蓝色)。和双元素图像一样,透明度字节为0xFF表示完全透明,而0x00表示完全不透明。 为了提高可读性,最好把所有的16进制字节都写全,包括前导0。然而,写出每个字节有时是不必要的。例如可以把一个三元素图像的蓝色像速写成0xFF而不是0x0000FF。 像素的排列规定从左到右、从底到顶的顺序。第一个16进制数描述一个图像最左下角的像素,最后一个则描述右上角的像素。 例:1 2 1 0XFF 0X00 一个像素宽,两个像素高的灰度图像,底部像素是白的,顶部像素是黑的。 2 4 3 0XFF0000 0X00FF00 0 0 0 0 0XFFFFFF 0XFFFF00 两个像素宽,四个像素高的RBG图像,左下角像素是红色,右下角像素是绿色,中间两行是黑色,左上角像素是白色,右上角像素是黄色。 在任何脚本节点或原型内都可以使用这种类型的域,但是,使用的具体地点只能在PiexlTexture(像素纹理)节点。 SFImage域的输出事件的初始值为(0,0,0)。 SFInt32和MFInt32 一个SFInt32域含有一个32位整数。一个SFInt32值是由一个十进制或十六进制(以OX开头)格式的整数构成。 一个 MFInt32域是多值域,由任意数量的以逗号或空格分隔的整数组成。例如: [17,-0xE20,-518820] SFInt32域的输出事件的初始值为0,MFInt32域的输出事件的初始值为[]。 SFNode和MFNode 一个SFNode域含有一个单节点,必须按标准节点句法写成。 一个MFNode域包含任意数量的节点。例: [Transform{translation 1 0 0}, DEF PANDORA box{}, USE PANDORA] 一个SFNode允许包含一个关键字NULL,此时,表示它不包含任何节点。 注意:一个组或一个变换的children域也就是列出一组节点的MFNode域。 把SFNode域放入一个脚本节点,就使节点的脚本可以直接存取列在SFNode域的节点,而不需要一个ROUTE语句。 SFNode域的输出事件的初始值为NULL,MFNode域的输出事件的初始值为[]。 SFRotation和MFRotation SFRotation域规定一个绕任意轴的任意角度的旋转。SFRotation值含有四个浮点数,各数之间以空格分隔。前三个数表示旋转轴(从原点到给定点的向量);第四个数表示围绕上述轴旋转多少弧度。例:绕y轴旋转180o表示为 0 1 0 3.1416 MFRotation域可包含任意数量的这类旋转值。 注意:视点的旋转是从缺省的视点方向开始的,该方向是从(0,0,10)沿-z轴观察。 SFRotation域的输出事件的初始值为(0 0 1 0),MFRotation域的输出事件的初始值为[]。 SFString和MFString SFString域包含一串字符,各字符遵照UTF-8字符编码标准(ASCII是UTF-8的子集,可以由于SFString域)SFString值含有双引号括起来的UTF-8 octets字符串。任何字符(包括“#”和换行符)都可在双引号中出现。 为了在字符中使用双引号,在它之前加一个反斜杠“\”。为了在字符串中使用反斜杠,连续打两个反斜杠“\\”。例如: "One,Two,Three,123." He asked, \"Who is #1?\"" MFString域含有零个或多个单值,每个单值都和SFString值的格式一样。 SFString域的输出事件的初始值为“”,MFString域的输出事件的初始值为[]。 SFTime和MFTime SFTime域含有一个单独的时间值。每个时间值是一个ANSI C格式的双精度浮点数,表示的是从1970年1月1日(GMT,格林威治平均时)子夜开始计时,延续当前时间的秒数。 MFTime域包含任意数量的时间值。 SFTime域的输出事件的初始值为-1,MFTime域的输出事件的初始值为[]。 SFVec2f和MFVec2f SFVec2f域定义了一个二维向量。SFVec2f的值是两个由空格分隔的浮点数。 MFVec2f域是多值域,包含任意数量的二维向量值。例如: [0 0,1.2 3.4,98.6 -4e1] SFVec2f域的输出事件的初始值为(0 0),MFVec2f域的输出事件的初始值为[]。 SFVec3f和MFVec3f SFVec3f域定义了一个三维空间的向量。一个SFVec3f值包含三个浮点数,数与数之间以空格分隔。该值表示从原点到所给定点的向量。 MFVec3f域包含任意数量的三维向量值。例如: [0 0 0,1.2 3.4 5.6,98.6 -461 451] SFVec3f域的输出事件的初始值为(0 0 0),MFVec3f域的输出事件的初始值为[]。 关于vrml script的学习,请看: %3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D8 |