1. 程式人生 > >Houdini學習 —— 過程化生成城市叢集學習筆記2(cluster simulation部分)

Houdini學習 —— 過程化生成城市叢集學習筆記2(cluster simulation部分)

這篇部落格介紹了在學習使用Houdini進行過程化生成城市叢集的時候的學習筆記中,生成建築聚簇的方法。對應的資料來自於pluralsight,傳送門。

背景

想不到吧,清明假期之後我們還有一天的假!

Cluster simulation

在之前的raw material處理完後,就可以開始通過生成的單個建築資料來構建城市的聚簇了。

這裡使用的生成聚簇的方法是比較常用的方法 —— 在光滑的平面上生成很多建築,然後在中心施加一個引力,然後進行物理模擬,最終生成多個可供選用的聚簇。

資料相關

首先,需要設定在場景裡的物件生成邏輯。這裡是使用Houdini的copy stamp節點來完成的,這也是我對Houdini最驚歎的幾個功能之一。

架構設定

/obj下新建一個Buliding_ClusterGeometry節點,這個節點用於生成建築的聚簇。

節點下的graph如下:
Building cluster

首先使用object merge節點將之前的housecommercial的資料匯入,由於後期需要進行point cloud的製作,所以需要使用point節點針對每個頂點設定對應的normal(geometry)&up(particle)的設定。

這裡有個小問題,Houdini 16裡的point節點已經被顯示為point old了,在新的point中可以新增normal,但是找不到新增up的節點,所以這裡依然還是使用point old

節點。

之後,需要新增一個大的box,並且往下挪一點,作為進行物理模擬的平面。

ground box

此外,還需要一個dopnet節點用於物理模擬和dopimport節點進行物理模擬後的資料輸出。

copy stamp設定與應用

copy stamp設定

新增一個copy節點,設定3個input stamp,用於控制commercial、houses的生成,以及每個生成的建築bounding box的隨機朝向。

copy stamp

對應的表示式程式碼挺清晰的,應該不需要多說,house和commercial的值設定為隨機生成對應的值。rotation值用於生成隨機的0,90,180,270的值。

順便,需要取消掉Transform using template point attribute

,因為我們需要手動設定每一個生成的點的朝向。

copy stamp值的使用

首先,先把rotation值用上 —— 新增一個transform節點,並且將rotationy值設定為copy stamp節點的rotation變數值。
rotation apply

然後在houses&commercial的switch節點中的select input值設定為stamp("../../Building_clusters/copy1", "houses_var", 1),但是考慮到過程化生成,需要改動之前的import程式碼,在最後加上這兩行程式碼:

switch_houses.parm("input").setExpression('stamp("../../Building_clusters/copy1", "houses_var", 1)')
switch_commercial.parm("input").setExpression('stamp("../../Building_clusters/copy1", "commercial_var", 1)')

reimport,最後,進行一下pack即可。

物理相關

dopnet內部的graph如下:
physics graph

很簡單的物理模擬,static object用於地面box,rbdpackedobject設定為輸出的資料。

需要注意的是,把compute mass取消掉,因為這裡並不需要考慮質量。此外,記得把rotational stiffness歸0,地面的摩擦係數也要設為0.

針對於中心的引力,popvop設定如下,本質上只是一個很簡單的vector計算:
pop vop

dopimport節點要進行DOP network和mask的設定。Import style要設定為Fetch Geometry from DOP network。

dop import

這樣一來就可以將最終的結果進行快取並且輸出了。可以選擇使用ROP節點輸出資料到磁碟資料,然後在需要的時候再讀入,也可以使用NULL節點並且進行Lock來進行快取,不過這樣整個檔案會大一些。

這裡選擇後一種方法,建立6個null節點,對每個節點,在物理模擬200幀後,進行lock操作,然後disconnect節點連線,就得到了快取資料。

最後的快取資料如下:

House聚簇:
house1

house2

house3
Commercial聚簇:
commercial

commercial2

commercial3

之後就可以使用這些資料來生成point cloud了。

<全文完>