第八讲 纹理映射
在前面几讲中,我们是通过Material节点来改变物体的外观特性。这些特性仅仅是一致性的宏观效果,对于物体的某些细节我们还没有涉及到。通过纹理映射和处理可以为物体的表面细节增强表现力。
本讲分三个部分来讨论:一是X3D基本纹理节点的使用,二是使用纹理的坐标系统,三是纹理的变换。
一、 X3D基本纹理节点的使用
X3D中,提供了PixelTexture(像素纹理)、ImageTexture(贴图纹理)和MovieTexture(影像纹理)三个节点。对于MovieTexture(影像纹理)节点,我们将在后面的"多媒体效果"中再做具体讨论,这里仅讨论前面两个基本纹理节点。
1、 PixelTexture(像素纹理)节点
PixelTexture 节点是用一个包含像素值的数组创建一个二维纹理帖图,其主要属性有:
image -- 用一个数组来定义一个二维图像。该数组分为两个部分,前三个是其特征值,后面的数值为实际的像素值。
前三个特征值的含义是:第一、二个数用来表示宽度方向和高度方向的像素个数,第三个值是表示后面实际像素字节的组成。具体如下:
当为1时,像素值为单字节,即取值范围为0x00~0xFF,表示明亮程度(灰度);
当为2时,像素值为双字节,第1个字节表示明亮程度,第2字节表示alpha值(即透明度)。
当为3时,像素值为三字节,分别用来表示RGB各颜色分量。
当为4时,像素值为四字节,前三个字节用来表示RGB各颜色分量,第四个字节表示alpha值。
repeatS -- 表示是否沿S轴水平重复纹理。默认值为True 。
repeatT -- 表示是否沿T轴垂直重复纹理。默认值为True 。
repeatT [repeatT: initializeOnly type SFBool (truefalse) "true"]
下面来看一个简单的示例代码:
其中,PixelTexture 节点的image值为"2 2 3 0xff0000 0x00ff00 0x0000ff 0xffffff"。也就是说,像素值使用三字节,分别表示RGB各颜色分量。由于宽度和高度均指定2个数量,因此需要2×2=4个像素值。
结果如下图所示,注重立方体的颜色分布(不同的浏览器插件其结果可能不一样)。
从上图可以发现像素纹理处理的规律:默认时,自动将水平和垂直按指定宽度方向和高度方向的像素字节数进行平均分割,每一个分割区域的中点为像素纹理点,然后向四面进行过渡。参见下列示意图:
若要指定透明度,可参照下列示例:
其中,PixelTexture 节点的image值为"2 2 4 0xff000000 0x00ff0040 0x0000ff80 0xffffffff"。结果如下图所示:
上述代码中,黄色球和像素纹理的立方体同在一个原点,由于设置了透明度,因此看起来很炫丽。你能看出alpha值的大小和透明度关系吗?答案是:alpha值为0时完全透明,为0x00小0xff时不透明。
2、 ImageTexture(贴图纹理)节点
ImageTexture 是用来指定一个图像映射到一个几何形体的表面上。它与PixelTexture 节点的属性基本相同,只不过image属性被换成了url属性。
ImageTexture节点的url属性用来指定图像的文件名和位置。例如下列代码:
结果如下图所示:
上述x3d.gif图片文件是放在与示例代码文件相同的文件夹中。需要说明的是:对于基本几何体,默认处理时各个面均会贴图。进入讨论组讨论。