📄 第十九章 高级外观控制.txt
字号:
第十九章 高级外观控制.txt
本章介绍如何控制纹理贴图在空间造型表面上的映射方式,其中包括了纹理贴图的平移、缩放、旋转以及平铺等效果;除此之外还将介绍空间造型表面的明暗控制,适当的明暗将创建出更加逼真的空间造型表面,而并不增加空间造型的平面数。另外,同样可以将表面纹理贴图指定到第18单元介绍的挤压造型、海拔栅格造型和点线面造型的表面上去。
回顾第18章介绍过的,为空间造型指定所需要的表面纹理贴图的方法。通常是通过Appearance节点中的texture域值为空间造型指定表面纹理贴图的,而Appearance节点又是作为Shape节点的appearance域值出现在VRML文件中的。
其通用的VRML文件结构如下:
Shape {
appearance Appearance {
material Material {......}
texture ImageTexture {......}
geometry ......
}
在VRML可以作为texture域值出现的节点包括ImageTexture节点、PixelTexture节点和MovieTexture节点。下面将通过ImageTexture节点将一个纹理贴图指定到一个挤压造型上去,由此复习VRML中纹理贴图的使用方法并且开始本章的介绍。
见实例 [为挤压造型指定纹理贴图.wrl]
1、表面纹理贴图控制
对指定在空间实体造型表面、空间面以及海拔栅格上的纹理贴图进行所需要的调整和控制。
1.贴图坐标系控制
首先给出空间造型外观控制节点Appearance节点的语法:
Appearance {
material NULL #域值类型 SFNode
texture NULL #域值类型 SFNode
textureTransform NULL #域值类型 SFNode
}
material域和texture域在第八章已经介绍过。
textureTransform域值用来指定通过texture域值给出的纹理贴图在空间造型表面上的坐标变换,一般是由textureTransform节点作为其域值出现。textureTransform域值可以通过事件输入接口set_textureTransform进行重新设置;新的textureTransform域值通过输出接口textureTransform_changed传送出去。
TextureTransform节点语法
TextureTransform {
translation 0.0 0.0 #域值类型 SFVec2f
rotation 0.0 #域值类型 SFFloat
scale 1.0 1.0 #域值类型 SFVec2f
center 0.0 0.0 #域值类型 SFVec2f
}
VRML纹理贴图坐标的概念:和整个VRML空间一样,VRML也为置入的每一个纹理贴图创建了一个坐标系,只不过前者的坐标系是三维空间坐标系,而后者是二维的坐标系。
VRML纹理贴图坐标是一个二维的直角坐标系,其中坐标原点位于贴图的坐下角处,水平向上定义为S轴,垂直方向上是T轴。在这个贴图坐标系中可以对表面贴图进行平移、旋转、缩放和切割的变换。
TextureTransform节点中的各个域值正是对贴图坐标系进行各种控制,将相对于原先的贴图坐标系创建出一个新的贴图坐标系。
translation域用于指定新的空间坐标系相对于原先坐标系的空间位置,换句话说就是新形成的坐标系原点在原有坐标系中的空间位置。(可以使用事件接口)
rotation用于指定新的空间坐标系相对于原先坐标系的旋转轴和旋转角度。默认值表示没有发生坐标轴的旋转。(可以使用事件接口)
center域用于指定造型旋转的旋转中心,缺省值为坐标原点,也就是贴图的左下角点。(可以使用事件接口)
scale用来控制在S轴和T轴方向上贴图坐标系的缩放比例。默认值在水平方式和垂直方向上都不发生比例缩放。(可以使用事件接口)
[贴图坐标系变换.wrl] 是一个经过贴图坐标控制之后的表面贴图指定到了一个空间面上。(scale 4.0 2.0 表示将表面贴图在水平方向上变为原有长度的1/4,而在垂直方向上变为原有长度的1/2。)
2.贴图的平铺
前面的例子,是将指定表面贴图自动地覆盖满整个空间造型表面或空间面。其实在VRML中可以通过ImageTexture节点、PixelTexture节点、MovieTexture节点中的reapeatS域和repeatT域值来控制指定的贴图是否在当前的贴图坐标系的S方向和T方向上平铺重复。并且在上述3个贴图节点中reapeatS域和repeatT域的使用方法完全相同,这里只介绍ImageTexture节点。
1.ImageTexture {
url {} #域值类型 MFString
repeatS TRUE #域值类型 SFBool
repeatT TRUE #域值类型 SFBool
}
reapeatS域和repeatT域值来控制指定的贴图是否在当前的贴图坐标系的水平方向和垂直方向上平铺重复。在这两个方向上的平铺与否是完全独立和相互影响,也就是说可以在其中一个方向上平铺重复,而在另外一个方向上不平铺重复。默认值表示在两个方向上贴图都将平铺重复。
[表面贴图的平铺控制.wrl] 指定了表面贴图只是在垂直方向上平铺重复。
3.表面贴图的切割使用
对于空间面造型和海拔栅格造型而言,都是由一些给定的空间点参数按给定的顺序形成的空间表面所形成的。因此在VRML中可以通过这些空间点在其表面上指定相应的区域面将表面贴图指定到这个区域中。在这里所用到的VRML节点是TextureCoordinate节点,其作用句是在贴图坐标系中从指定的表面贴图中“切割”下来所需要的那一部分。
只要在贴图坐标系中给出空间点参数,然后给定空间点的连接顺序形成的切割区域。
TextureCoordinate节点就是用来给出一系列的贴图空间点参数。而TextureCoordinate节点通常作为IndexedFaceSet节点和ElevationGrid节点的texCoord域值出现,而空间点参数的连接顺序列表将由上述两个节点中的另外一个域texCoordIndex域值给出,可以看出贴图的切割方式和第18章所介绍的空间面的着色原理相似。
TextureCoordinate语法
TextureCoordinate {
point [] #域值类型 MFVec2f
}
point就是给出一系列的贴图坐标点参数,这些点的坐标是相对于当前的贴图坐标面而言的。其中的第1个坐标参数对应texCoordIndex域值中的索引值为0,第2个坐标参数对应的索引值为1,其余依此类推。(可以使用事件接口)
TextureCoordinate节点通常用于IndexedFaceSet节点和ElevationGrid节点中texCoord域值。
IndexedFaceSet语法
IndexedFaceSet {
coord NULL #域值类型 SFNode
coordIndex [] #域值类型 MFInt32
texCoord NULL #域值类型 SFNode
texCoordIndex [] #域值类型 MFInt32
color NULL #域值类型 SFNode
colorindex [] #域值类型 MFInt32
colorPerVertex TRUE #域值类型 SFBool
normal NULL #域值类型 SFNode
normalIndex [] #域值类型 MFInt32
normalPerVertex TRUE #域值类型 SFBool
ccw TRUE #域值类型 SFBool
convex TRUE #域值类型 SFBool
solid TRUE #域值类型 SFBool
creaseAngle 0.0 #域值类型 SFFloat
set_coordIndex #输入接口 MFInt32
set_texCoordIndex #输入接口 MFInt32
set_colorIndex #输入接口 MFInt32
set_normalIndex #输入接口 MFInt32
}
texCoord域值通过TextureCoordinate节点给出了一系列的空间点参数。(可以使用事件接口)
texCoordIndex域值提供了一个描述贴图切割面的周界的列表。其中每一个值都是整型的索引,并且每个索引都指定了在texCoord域内的坐标列表中的一个坐标。缺省值表示没有任何平面会被创建。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -