?? 第十九章 高級外觀控制.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 + -