CityEngine中文實例_第1頁
CityEngine中文實例_第2頁
CityEngine中文實例_第3頁
CityEngine中文實例_第4頁
CityEngine中文實例_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Tutorial_06_Basic_Shape_Grammar_2011_11.構(gòu)建簡單建筑物;2.為簡單建筑物貼紋理;3.添加LOD;4.建筑物屬性隨機變化。一、構(gòu)建簡單建筑物本節(jié)學習最終要構(gòu)建一個如下圖的建筑物,該建筑物有地面一樓和其他樓層,一樓的正面有一個入口的門,其他窗口都使用的是一個提前做好的OBJ模型。下面開始創(chuàng)建規(guī)則進行建模:    為了更好的理解規(guī)則,我們自己創(chuàng)建一個新的規(guī)則,按照教程中的語句進行規(guī)則的書寫。1.    在規(guī)則文件的最開始處定義建筑的屬性(也可以放在規(guī)則文件的其他位置)。在CGA文件中,這些屬

2、性將對整個規(guī)則文件產(chǎn)生作用。這些屬性將顯示在屬性查看器(Inspector)中,可通過屬性查看器修改這些屬性。attr groundfloor_height = 4 /地面一樓的高度attr floor_height = 3.5 /其他樓層的高度attr tile_width = 3 /將樓面按塊劃分的寬度attr height = 11 /樓高attr wallColor = "#fefefe" /墻面顏色2.    教程中構(gòu)建的窗戶是使用的一個已經(jīng)建好的窗戶模型window.obj,這個文件存放在assets文件夾中,使用之前也要

3、先定義出來。window_asset = "facades/window.obj" /指定obj文件 3.    下面我們定義第一條規(guī)則為Lot. 在屬性檢查器中,該規(guī)則被指定為開始規(guī)則。大量的模型是使用拉伸操作創(chuàng)建而來的:/對shape使用height中定義的高度進行拉伸,并命名為BuildingLot -> extrude(height) Building 拉伸之后如下圖:    4.    可以通過應(yīng)用comp()將Buil

4、ding分解為多個面, 生成了正面(FrontFacade)、多個側(cè)面(SideFacade)和一個頂面(Roof)Building-> comp(f) front : FrontFacade | side : SideFacade | top: Roof5.    分解完成之后,就開始開始對這些面進行外觀造型。典型的外觀造型流程如下:1,將面分解為樓層(Floors)。2,將樓層分解為塊(Tile),每一塊通常由墻面和窗口構(gòu)成。這樣的細分過程在CGA要素語法的實現(xiàn)過程如下圖: /下面的FrontFacade規(guī)則將正面沿y軸方向,分割為兩

5、大部分,第一部分高度為groundfloor_height的地面一層Groundfloor,剩余的以floor_height高度進行重復(fù)分割(以*符號標記),分割為多個Floor。FrontFacade -> split(y) groundfloor_height : Groundfloor | floor_height: Floor * 正面分割之后如下圖: 6.     細分側(cè)面:SideFacade -> split(y) groundfloor_height: Floor | floor_height: Floor * Si

6、deFacade規(guī)則將側(cè)面沿y軸方向分割也分為兩大部分,這兩部分使用的都是是相同的Floor對象,因此側(cè)面這兩大部分看起來都應(yīng)該是一樣的。只有高度不一樣,高度不一樣主要是為了與正前面的樓層高度保持一致。側(cè)面分割之后如下圖,三個側(cè)面都是一致的: 7.     繼續(xù)對Floor對象進行細化:/先給每層樓在x軸方向的兩端畫出寬度為1的墻面(Wall),剩余的部分以tile_width為寬度重復(fù)分割(Tile)Floor -> split(x) 1: Wall | tile_width: Tile * | 1 : Wall 如下圖:8.

7、     最后對正面的地面一樓進行細化:/同樣先在x軸方向的兩端畫出寬度為1的墻面(Wall),按照tile_width劃分為多個Tile,并按照tile_width劃分出一個入口EntranceTile。Groundfloor ->split(x) 1: Wall | tile_width: Tile * | tile_width: EntranceTile | 1: Wall 結(jié)果如下圖:9.     下面對Tile進行定義:/先對Tile在x軸方向中間劃分出寬度為2的一部分(對這部分

8、再按y軸方向先劃分一個高度為分別為1和1.5的wall和window,剩余的高度也定為wall),然后兩邊分別劃分為寬度大概為1的wallTile -> split(x) 1 : Wall | 2 : split(y) 1: Wall | 1.5: Window | 1: Wall | 1 : Wall 結(jié)果如下: 10.  對EntranceTile進行定義:EntranceTile -> split(x) 1 : SolidWall | 2 : split(y) 2.5: Door | 2: SolidWall | 1 : SolidWall 先對

9、入口在x軸方向劃分寬度為2的一部分(這部分在y軸方向先劃分2.5高度的Door,剩余的大約高度2定為SolidWall.),然后兩邊各為大約1米的Solidwall。 11.  最后對前面定義的Window,Door,Wall和SolidWall寫具體的規(guī)則。Window -> s('1,'1,0.4) t(0,0,-0.25) i(window_asset)Door -> s('1,'1,0.1) t(0,0,-0.5) i("builtin:cube")Wall -> color(wallC

10、olor)SolidWall -> color(wallColor) s('1,'1,0.4) t(0,0,-0.4) i("builtin:cube:notex")這里解釋一下上面出現(xiàn)的幾個命令:     s('1,'1,0.4):命令:s(float xSize, float ySize, float zSize)作用設(shè)置形狀的尺寸。eg1:   s(5,5,5)   表示將三個方向的值設(shè)為絕對值5eg2:   s('0.5,

11、'1,'1.5)  等同于  s(0.5*scope.sx,scope.sy,1.5*scope.sz),如果加上'符號,括號內(nèi)的值在0-1之間,表示設(shè)置xyz的值為原先的多少倍。   t(0,0,-0.25)平移:t(tx, ty, tz)   i(window_asset)或者i("builtin:cube:notex")對象替換:i(geometryPath)CityEngine有內(nèi)置的素材可以直接使用,分為Geometry Assets和Textures。Geometry Asset

12、s:       builtin:cube有節(jié)點的單位立方體,帶有紋理圖層的紋理坐標系       builtin:cube:notex單位立方體,不帶有紋理坐標系Textures:       builtin:default表示16×16黑白方格相間的紋理       builtin:uvtest.png使用CE標準的測試紋理

13、最終效果:到此我們完成了簡單建筑物的構(gòu)建,學習了構(gòu)建流程,如何拉伸、分解面、分割Tile等。規(guī)則可以一步步嘗試,也可以替換成其他顏色或?qū)bj替換為其他模型。如下: 二、為簡單建筑物貼紋理本節(jié)內(nèi)容開始對之前構(gòu)建的建筑貼上紋理。使用的規(guī)則是在上一節(jié)的基礎(chǔ)上進行修改。作者也是在學習中,內(nèi)容中如有不對的地方,歡迎大家指正。1.        開始貼紋理之前,先在規(guī)則的最前面對要使用的紋理進行定義。/ texturesfrontdoor_tex      

14、0;  = "facade/shopdoor.tif"wall_tex     = "facade/brickwall2.tif"dirt_tex     = "facade/dirtmap.15.tif"roof_tex     = "roof/roof.tif"由于要使用的窗戶的紋理有9種不同的紋理,這些紋理存放在assets/façade文件夾中。在使用的時候,我們這里定義隨機獲取其中一個窗

15、戶紋理,這樣窗戶的紋理就是隨機的了。randomWindowTexture = fileRandom("*facades/textures/window.*.tif")2.        為建筑物的正面和側(cè)面定義紋理Frontfacade ->    setupProjection(0, scope.xy 1.5, 1, 1)    setupProjection(2, scope.xy, scope.sx,

16、scope.sy)    split(y) groundfloor_height : Groundfloor | floor_height: Floor * Sidefacade ->    setupProjection(0, scope.xy, 1.5, 1, 1)    setupProjection(2, scope.xy, scope.sx, scope.sy)     split(y) groundfloor_height: Floor

17、| floor_height: Floor * 添加紅色部分的代碼,setupProjection()定義面在scope的xy平面使用color和dirt圖片(由通道0和通道2代表)。在使用color map時,紋理圖片將以1.5m×1m進行重復(fù)貼模。而使用dirt map時,將會在scope的x、y方向平鋪。其中setupProjection()命令有以下幾種:setupProjection(uvSet, axesSelector, texWidth, texHeight)setupProjection(uvSet, axesSelector, texWidth, texHeigh

18、t, widthOrigin, heightOrigin)setupProjection(uvSet, axesSelector, texWidth, texHeight, widthOrigin, heightOrigin, uwFactor)(1) uvset代表的是不同的紋理圖層:(2)axesSelector定義哪個軸分別代表u和v軸,可選的參數(shù)有:scope.xy, scope.xz, scope.yx, scope.yz, scope.zx, scope.zy  以scope的軸定義world.xy, world.xz, world.yx, world.yz, world

19、.zx, world.zy  以world的軸定義(3)texWidth和texHeight分別代表紋理的寬度和長度。如果值小于0,則認為可以對紋理做鏡像顯示,符號表示值大小可以浮動,符號表示相對值。(4)widthOrigin和heightOrigin分別代表距離u方向和v方向的偏移(5)uwFactor設(shè)置w軸值相對于u軸的系數(shù),默認為03.        添加Roof規(guī)則Roof ->    setupProjection(0, scope.xy, scope.s

20、x, scope.sy)       texture(roof_tex)    projectUV(0)其中projectUV()命令含義如下:命令:projectUV(uvSet)指定紋理應(yīng)用于哪個uvset。4.        為窗戶和門指定紋理:Window ->    s('1,'1,0.4)    t(0,0,-0.25) &

21、#160;  texture(randomWindowTexture)    i(window_asset) Door ->    s('1,'1,0.1)    t(0,0,-0.5)    texture(frontdoor_tex)     i("builtin:cube")  5.     

22、;   定義Wall和SolidWall的紋理Wall ->    color(wallColor)    texture(wall_tex)     set(material.dirtmap, dirt_tex)    projectUV(0) projectUV(2)SolidWall ->    color(wallColor)    s('

23、1,'1,0.4)    t(0,0,-0.4)    texture(wall_tex)     set(material.dirtmap, dirt_tex)    i("builtin:cube:notex")      projectUV(0) projectUV(2)為Wall和SolidWall定義使用的紋理,使用set()命令定義在material.dir

24、tmap屬性,使用dirt_tex紋理。然后定義了將紋理貼在color和dirt通道。set(attribute, bool value)set(attribute, float value)set(attribute, string value)set命令將一個值指定給當前shape的一個屬性。屬性分為兩類,一種是builtin屬性,就是內(nèi)置屬性,例如material的屬性。另一種是在規(guī)則文件中生命的屬性。最終結(jié)果如下圖:三、給建筑物制作LODLOD技術(shù)主要是根據(jù)距離建筑物對象的距離來調(diào)用不同復(fù)雜度的模型,即在較遠距離時顯示復(fù)雜度低的模型,在較近距離時顯示復(fù)雜度

25、高的模型。在CityEngine中為了提高顯示效率,也可以使用LOD機制。本節(jié)我們就給建筑物模型添加一個簡單的LOD機制。當我們要創(chuàng)建大范圍的建筑物模型時,可以由此降低模型的復(fù)雜度(多邊形的數(shù)量)。1、添加LOD屬性attr LOD = 1在本示例中,只設(shè)置兩個顯示級別:LOD 0:代表較低級別,低復(fù)雜度LOD 1:代表較高級別,高復(fù)雜度因為模型制作中,我們做的模型已經(jīng)是搞分辨率的模型,因此現(xiàn)在通過簡單的步驟創(chuàng)建低分辨率模型。2 、為模型設(shè)置LOD在目前的模型中,對于window類型的模型,之前是使用obj文件創(chuàng)建的一個較復(fù)雜的窗戶,可以通過使用紋理平面代替obj這種復(fù)雜模型。需要添

26、加紅色部分的代碼:Window ->  case LOD > 0 :  s('1,'1,0.4)  t(0,0,-0.25)  texture(randomWindowTexture)  i(window_asset)   else :                 texture(randomWindowTexture)當LOD大于0時,使用的是之前創(chuàng)建的高分辨率的窗戶模型,否則,使用的是一個簡單的平面。同樣的,對Door和SolidWall對象也添加類似的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論