推荐给好友 上一篇 | 下一篇

八、纹理映射

 

一、X3D-Edit安装配置

二、文本的显示

三、X3D2D图形的构造

四、基本3D图形的创建方法

五、立体造型的几何变换

六、视点和导航的设置

七、场景的光照效果

八、纹理映射

九、X3D场景的多媒体效果

十、X3D的动画效果

十一、X3D的交互技术

十二、X3D的嵌入脚本编程技术

十三、X3D的嵌入脚本Java编程技术

十四

八、纹理映射


 


在前面,我们是通过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 (true|false) "true"]


下面来看一个简单的示例代码:(见29.x3d29.x3dv29.wrl



其中,PixelTexture 节点的image值为"2 2 3 0xff0000 0x00ff00 0x0000ff 0xffffff"。也就是说,像素值使用三字节,分别表示RGB各颜色分量。由于宽度和高度均指定2个数量,因此需要2×2=4个像素值。


结果如下图所示,注意立方体的颜色分布(不同的浏览器插件其结果可能不一样)



从上图可以发现像素纹理处理的规律:默认时,自动将水平和垂直按指定宽度方向和高度方向的像素字节数进行平均分割,每一个分割区域的中点为像素纹理点,然后向四周进行过渡。参见下列示意图:



若要指定透明度,可参照下列示例:(见30.x3d30.x3dv30.wrl



其中,PixelTexture 节点的image值为"2 2 4 0xff000000 0x00ff0040 0x0000ff80 0xffffffff"。结果如下图所示:



上述代码中,黄色球和像素纹理的立方体同在一个原点,由于设置了透明度,因此看起来很炫丽。你能看出alpha值的大小和透明度关系吗?答案是:alpha值为0时完全透明,为0x000xff时不透明。


2 ImageTexture(贴图纹理)节点


ImageTexture 是用来指定一个图像映射到一个几何形体的表面上。它与PixelTexture 节点的属性基本相同,只不过image属性被换成了url属性。


ImageTexture节点的url属性用来指定图像的文件名和位置。例如下列代码:(见31.x3d31.x3dv31.wrl



结果如下图所示:



上述x3d.gif图片文件是放在与示例代码文件相同的文件夹中。需要说明的是:对于基本几何体,默认处理时各个面均会贴图。


 


二、 使用纹理的坐标系统


我们知道,图像和被映射的形体表面之间有一个映射关系。默认时,BS Contact是将图像全部放大到对应的形体表面上。若改变此默认的映射比例,则可使用X3DTextureCoordinate节点。


TextureCoordinate用来描述纹理帖图自身所在的坐标点,该坐标点是二维的,分别表示对应图像上的原点的相对水平和垂直距离。若坐标点取值在01之间,则这些坐标点落在图像内部,否则落在图像外部。


TextureCoordinate节点的坐标点属性point通常用在IndexedFaceSetElevationGrid节点的texCoordindex属性中。例如下面的代码:(见32.x3d32.x3dv32.wrl



说明:


(1) IndexedFaceset节点用来将一组顶点来构造的一个3D平面形体。各形体表面是在coordIndex属性中通过来指定构造平面点(Coordinate节点指定)的索引值来指定。当索引值为-1时,表明当前表面已经结束,下一个表面将要开始。


(2) 上述代码中,IndexedFaceset节点仅构造了一个面,如下面的示意图所示,图中的粗体数字表示该点在Coordinate节点的point属性中的索引号。



注意:在计算机图形学中,每一个面都有方向,并满足右手定则:右手四指的方向是指定的点的次序方向,大拇指方向为该平面的法向方向。若构成立体的各个表面的法向方向都是从由立体内部指向外部,则围成的是一个封闭的实体。


结果如下图所示:



在上述代码中再添加代码,并修改IndexedFaceSet节点的texCoordindex属性,如下所示:(见33.x3d33.x3dv33.wrl



结果如下:



分析:


(1) TextureCoordinate节点指定的坐标点如下所示的示意图。由于在映射时,由IndexedFaceSet节点的texCoordindex属性指定的平面多边形图像应和coordIndex属性指定的平面多边形相映射。即图像0点和平面0点相对应,所以贴图看起来是上图的样子。


(2) 若指定ImageTexturerepeatSrepeatT的属性为True。则还会在面上沿水平方向和垂直方向重复贴图。(见34.x3d34.x3dv34.wrl



上述代码仅仅是构造一个面,若构造一个体也可同样进行。如下面的代码:(见35.x3d35.x3dv35.wrl



结果如下图所示:



三、 纹理的变换


X3D的节点TextureTransform 是用来改变帖图的二维纹理坐标的位置、方向和比例, 因为帖图先进行变换然后再贴到几何体上,所以视觉效果是相反的。如下面的代码:(见36.x3d36.x3dv36.wrl



结果如下图所示:



注意:


(1) TextureTransform的值和显示在形体上的结果刚好相反。


(2) 旋转只要指定相应的旋转角度(弧度值)即可。


(3) 坐标是图像的相对坐标。即取值在01之间,则这些坐标点落在图像内部,否则落在图像外部。


(4) 水平和垂直方向的比例值可以不同。


需要说明的是:对于X3D的多重纹理的使用,由于BS插件支持的不是很好,故这里暂不讨论。


 

评分:0

我来说两句

seccode