一、两类常见的域
有两类常见的域,一类只包含单值(所谓单值,可以是一个单独的数,也可以是定义一个向量或颜色的几个数,甚至可以是定义一幅图像的一组数),另外一类包含多个单值。单值类型的域,名称以“SF”开始;多值类型的域,名称以“MF”开始。
在VRML文件中,表示多值域的方法是:一系列用逗号和空格间隔开的单值,整个用方括号括起来。如果一个多值域不包含任何值,则只标出方括号(“[]”),其中不填任何数。如果一个多值域恰好只包含一个数,可以不写括号,直接写该值。例如,可以表示一个多值域,其中只包含一个单独的整数1,下列两种方式均属有效:
1 [1]
二、两种域的值
单值类型的域按英文字母的顺序给出;多值域按相应的单值域配合列出。事件的类型与域的类型是完全一致的。每一个事件类型都具有一个相关的初始值,在类型描述中有所规定。当脚本试图读取一个尚未发送的输出事件的数值时,该初始值被返回。
三、VRML域值的各种类型
1.SFBool
SFBool域只含有一个Bool值。TRUE和FALSE(不带引号也不带任何标点符号)是SFBool域仅有的两个有效值。
SFBool输出事件的初始值是FALSE。
注意:一般的程序设计重用1和0表示True和False值,在VRML中不允许。
2.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域的输出事件的初始值是[]。
3.SFFloat和MFFloat
SFFloat域含有一个ANSI C格式的单精度浮点数。
MFFloat域含有零个或多个ANSI C格式的单精度浮点数。即允许空白,不赋任何值。
SFFloat域输出事件的初始值为0.0。MFFloat域输出事件的初始值为[]。
4.SFImage
SFImage域含有非压缩的二维彩色图像或灰度图像。
SFImage域,首先列出三个整数值,前两个表示图片的宽度和高度,第三个整数表示构成图像格式的元素个数(1~4),随后,按(宽度×高度)的格式列出一组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)。
5.SFInt32和MFInt32
SFInt32域含有一个32位整数。SFInt32值是由一个十进制或十六进制(以OX开头)格式的整数构成。
MFInt32域是多值域,由任意数量的以逗号或空格分隔的整数组成。例如:
[17,-0xE20,-518820]
SFInt32域的输出事件的初始值为0,MFInt32域的输出事件的初始值为[]。
6.SFNode和MFNode
SFNode域含有一个单节点,必须按标准节点句法写成。
MFNode域包含任意数量的节点。例:
[Transform{translation 1 0 0},
DEF PANDORA box{},
USE PANDORA]
SFNode允许包含关键字NULL,该值表示它不包含任何节点。
注意:组或一个变换的children域也就是列出一组节点的MFNode域。把SFNode域放入脚本节点,就使节点的脚本可以直接存取列在SFNode域的节点,而不需要ROUTE语句。
SFNode域的输出事件的初始值为NULL,MFNode域的输出事件的初始值为[]。
7.SFRotation和MFRotation
SFRotation域规定一个绕任意轴的任意角度的旋转。SFRotation值含有四个浮点数,各数之间以空格分隔。前三个数表示旋转轴(从原点到给定点的向量);第四个数表示围绕上述轴旋转多少弧度。例:绕y轴旋转180o表示为:
0 1 0 3.1416
MFRotation域可包含任意数量的这类旋转值。
注意:视点的旋转是从默认的视点方向开始的,该方向是从(0,0,10)沿-z轴观察。
SFRotation域的输出事件的初始值为(0 0 1 0),MFRotation域的输出事件的初始值为[]。
8.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域的输出事件的初始值为[]。
9.SFTime和MFTime
SFTime域含有一个单独的时间值。每个时间值是一个ANSI C格式的双精度浮点数,表示的是从1970年1月1日(GMT,格林威治平均时)子夜开始计时,延续当前时间的秒数。
MFTime域包含任意数量的时间值。
SFTime域的输出事件的初始值为-1,MFTime域的输出事件的初始值为[]。
10.SFVec2f和MFVec2f
SFVec2f域定义了一个二维向量。SFVec2f的值是两个由空格分隔的浮点数。
MFVec2f域是多值域,包含任意数量的二维向量值。例如:
[0 0,1.2 3.4,98.6 -4e1]
SFVec2f域的输出事件的初始值为(0 0),MFVec2f域的输出事件的初始值为[]。
11.SFVec3f和MFVec3f
SFVec3f域定义了一个三维空间的向量。一个SFVec3f值包含三个浮点数,数与数之间以空格分隔。该值表示从原点到所给定点的向量。
MFVec3f域包含任意数量的三维向量值。例如:
[0 0 0,1.2 3.4 5.6,98.6 -461 451]
SFVec3f域的输出事件的初始值为(0 0 0),MFVec3f域的输出事件的初始值为[]。