轉自:http://blog.sina.com.cn/s/blog_841eeb5201010p3e.html
CityEngine在貼圖的實現過程有兩種方式:第一種是通過i(geometryPath)規則引入外部帶貼圖的模型;第二種方式是通過texture(string texturePath)規則在CityEngine內部通過規則控制來完成貼圖的實現。下面通過具體的例子談一下這兩種方式在實際中的應用。
引入外部帶貼圖的模型
適用方向:模型被重復利用、結構較為復雜。
下面以蓋板為例來說一下引入外部帶貼圖模型的方法。
一、 模型導出時的注意事項
在用3DMax軟件把其它格式的模型導出為CityEngine支持的部件格式(如obj)時,要選擇帶有貼圖紋理和貼圖坐標。
默認情況下,OBJ導出選項窗口的面選項為四邊形,為了減少面數據根據需要可以選擇多邊形;材質導出的窗口中轉換位圖是被選中的,此種情況下貼圖的的尺寸會發生變化。下圖為max模型效果與導出obj之后在max里的顯示效果:
二、 引用規則的代碼與效果
Street-->
split(u,unitSpace,0){~3.6:Str_Tex | 0.2:color("#ff0000") X}*
Str_Tex-->
從上面兩個圖可以看出不用任何貼圖的代碼就可以完成模型的貼圖。
通過內部規則控制實現紋理貼圖
通過內部規則控制實現紋理貼圖,主要是指采用texture的方式進行貼圖。在使用texture進行貼圖的過程中其最關鍵的在於約束texture引入的圖片所代表的實際大小和其擺放的位置等信息,因而就產生了控制圖片代表實際尺寸、圖片重復的次數兩種方式的貼圖。下面就針對這兩種方式進行簡單的介紹。
控制圖片代表的實際尺寸
適用范圍:主要指建築物、護欄等的貼圖。
引用的規則代碼:
Lot-->
extrude(10)
comp(f){front:ftFacade | all:X}
ftFacade-->
setupProjection(0,scope.xy,scope.sx/rint(scope.sx/2.5),scope.sy/rint(scope.sy/1.5))
texture("WINDOW_02.jpg")
projectUV(0)
與貼圖相關的規則介紹:
setupProjection(uvSet,axeSelector,texWidth,texHeight)
該規則主要是對texture所引入的圖片進行了約束,其中uvSet的取值范圍[0,5],分別代表不同的Texture Layer,一般選0值;axesSelector確定了貼圖時圖片的U向和V向,texWidth和texHeight分別代表圖片的尺寸所對應的實際的寬度和高度。
texture(string texturePath)
該規則引入相應的貼圖。
projectUV(uvSet)
該規則通過應用相應的投影矩陣創建最終的紋理坐標。與3D Max的塌陷功能有點類似。
引入該規則之后建築貼圖的效果。
控制圖片的重復次數
適用范圍:道路或與道路相關的具有走向的平面貼圖。
引用的規則代碼:
lenAlongU=geometry.du(0,unitSpace)
Sidewalk-->
NIL
Street-->
normalizeUV(0, uv, collectiveAllFaces)
scaleUV(0,rint(lenAlongU/20),1)
texture("street_1lanes_stripes.png")
與貼圖相關規則的介紹:
normalizeUV(uvSet,uvNormalizeMode,uvNormalizeType)
該規則約束了貼圖是沿走向方向上進行貼圖的。uvNormalizeMode有三個值的選項:u、v和uv;之前做了一個簡單的測試發現它們的區別不是很大,在道路上貼圖時一般選擇uv項;uvNormalizeType有兩個值的選項:separatePerFace和collectiveAllFaces,之前采用第一個值時發現貼圖時並不按走向進行貼的,一般選擇第二個值。
scaleUV(float uvSet, float uFactor, float vFactor)
該規則約束了當前貼圖時的重復次數,其中uFactor代表長度方向上的重復次數,vFactor代表寬度方向上重復次數。
附注:本文檔提供的規則代碼可以在實際中實用,通過調整某些參數的值我們將會更清晰的理解這些規則、更好的實用這些規則。由於水平有限,其中的內容有解釋不清的地方敬請雅正。