VRML域值的数据类型

一、两类常见的域

有两类常见的域,一类只包含单值(所谓单值,可以是一个单独的数,也可以是定义一个向量或颜色的几个数,甚至可以是定义一幅图像的一组数),另外一类包含多个单值。单值类型的域,名称以“SF”开始;多值类型的域,名称以“MF”开始。

VRML文件中,表示多值域的方法是:一系列用逗号和空格间隔开的单值,整个用方括号括起来。如果一个多值域不包含任何值,则只标出方括号(“[]”),其中不填任何数。如果一个多值域恰好只包含一个数,可以不写括号,直接写该值。例如,可以表示一个多值域,其中只包含一个单独的整数1,下列两种方式均属有效:

1 [1]

二、两种域的值

单值类型的域按英文字母的顺序给出;多值域按相应的单值域配合列出。事件的类型与域的类型是完全一致的。每一个事件类型都具有一个相关的初始值,在类型描述中有所规定。当脚本试图读取一个尚未发送的输出事件的数值时,该初始值被返回。

 

三、VRML域值的各种类型

1SFBool

SFBool域只含有一个Bool值。TRUEFALSE(不带引号也不带任何标点符号)是SFBool域仅有的两个有效值。

SFBool输出事件的初始值是FALSE

注意:一般的程序设计重用1和0表示TrueFalse值,在VRML中不允许。

 

2SFColorMFColor

SFColor域是只有一个颜色值的单值域。SFColor值和RGB值一样,由一组三个浮点数组成。每个数都是从0.0~1.0,极值包括在内,分别表示构成颜色的红、绿、蓝三个分量。

MFColor域是一个多值域,包含任意数量的RGB颜色值。例如:

[ 1.0 0.0 0.00 1 00 0 1]  表示三种颜色红、绿、蓝的组成。

SFColor域的输出事件的初始值是(000)。而MFColor域的输出事件的初始值是[]

 

3SFFloatMFFloat

SFFloat域含有一个ANSI C格式的单精度浮点数。

MFFloat域含有零个或多个ANSI C格式的单精度浮点数。即允许空白,不赋任何值。

SFFloat域输出事件的初始值为0.0MFFloat域输出事件的初始值为[]

 

4SFImage

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域的输出事件的初始值为(000)。

 

5SFInt32MFInt32

SFInt32域含有一个32位整数。SFInt32值是由一个十进制或十六进制(以OX开头)格式的整数构成。

MFInt32域是多值域,由任意数量的以逗号或空格分隔的整数组成。例如:

[17-0xE20-518820]

SFInt32域的输出事件的初始值为0MFInt32域的输出事件的初始值为[]

 

6SFNodeMFNode

SFNode域含有一个单节点,必须按标准节点句法写成。

MFNode域包含任意数量的节点。例:

[Transform{translation 1 0 0}

DEF PANDORA box{}

USE PANDORA]

SFNode允许包含关键字NULL,该值表示它不包含任何节点。

注意:组或一个变换的children域也就是列出一组节点的MFNode域。把SFNode域放入脚本节点,就使节点的脚本可以直接存取列在SFNode域的节点,而不需要ROUTE语句。

SFNode域的输出事件的初始值为NULLMFNode域的输出事件的初始值为[]

 

7SFRotationMFRotation

SFRotation域规定一个绕任意轴的任意角度的旋转。SFRotation值含有四个浮点数,各数之间以空格分隔。前三个数表示旋转轴(从原点到给定点的向量);第四个数表示围绕上述轴旋转多少弧度。例:绕y轴旋转180o表示为:

0 1 0 3.1416

MFRotation域可包含任意数量的这类旋转值。

注意:视点的旋转是从默认的视点方向开始的,该方向是从(0010)沿-z轴观察。

SFRotation域的输出事件的初始值为(0 0 1 0),MFRotation域的输出事件的初始值为[]

 

8SFStringMFString

SFString域包含一串字符,各字符遵照UTF-8字符编码标准(ASCIIUTF-8的子集,可以由于SFString域)SFString值含有双引号括起来的UTF-8 octets字符串。任何字符(包括“#”和换行符)都可在双引号中出现。

为了在字符中使用双引号,可在它之前加一个反斜杠“\”。为了在字符串中使用反斜杠,则可连续打两个反斜杠“\\”。例如:

"One,Two,Three,123."

He asked, \"Who is #1?\"

MFString域含有零个或多个单值,每个单值都和SFString值的格式一样。

SFString域的输出事件的初始值为""MFString域的输出事件的初始值为[]

 

9SFTimeMFTime

SFTime域含有一个单独的时间值。每个时间值是一个ANSI C格式的双精度浮点数,表示的是从197011日(GMT,格林威治平均时)子夜开始计时,延续当前时间的秒数。

MFTime域包含任意数量的时间值。

SFTime域的输出事件的初始值为-1MFTime域的输出事件的初始值为[]

 

10SFVec2fMFVec2f

SFVec2f域定义了一个二维向量。SFVec2f的值是两个由空格分隔的浮点数。

MFVec2f域是多值域,包含任意数量的二维向量值。例如:

[0 01.2 3.498.6 -4e1]

SFVec2f域的输出事件的初始值为(0 0),MFVec2f域的输出事件的初始值为[]

 

11SFVec3fMFVec3f

SFVec3f域定义了一个三维空间的向量。一个SFVec3f值包含三个浮点数,数与数之间以空格分隔。该值表示从原点到所给定点的向量。

MFVec3f域包含任意数量的三维向量值。例如:

[0 0 01.2 3.4 5.698.6 -461 451]

SFVec3f域的输出事件的初始值为(0 0 0),MFVec3f域的输出事件的初始值为[]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值