Houdini學習 —— 過程化生成城市叢集學習筆記2(cluster simulation部分)
這篇部落格介紹了在學習使用Houdini進行過程化生成城市叢集的時候的學習筆記中,生成建築聚簇的方法。對應的資料來自於pluralsight,傳送門。
背景
想不到吧,清明假期之後我們還有一天的假!
Cluster simulation
在之前的raw material處理完後,就可以開始通過生成的單個建築資料來構建城市的聚簇了。
這裡使用的生成聚簇的方法是比較常用的方法 —— 在光滑的平面上生成很多建築,然後在中心施加一個引力,然後進行物理模擬,最終生成多個可供選用的聚簇。
資料相關
首先,需要設定在場景裡的物件生成邏輯。這裡是使用Houdini的copy stamp
節點來完成的,這也是我對Houdini最驚歎的幾個功能之一。
架構設定
在/obj
下新建一個Buliding_Cluster
的Geometry
節點,這個節點用於生成建築的聚簇。
節點下的graph如下:
首先使用object merge節點將之前的house
和commercial
的資料匯入,由於後期需要進行point cloud的製作,所以需要使用point節點針對每個頂點設定對應的normal(geometry)&up(particle)的設定。
這裡有個小問題,Houdini 16裡的point節點已經被顯示為point old
了,在新的point中可以新增normal,但是找不到新增up的節點,所以這裡依然還是使用point old
之後,需要新增一個大的box,並且往下挪一點,作為進行物理模擬的平面。
此外,還需要一個dopnet
節點用於物理模擬和dopimport
節點進行物理模擬後的資料輸出。
copy stamp設定與應用
copy stamp設定
新增一個copy節點,設定3個input stamp,用於控制commercial、houses的生成,以及每個生成的建築bounding box的隨機朝向。
對應的表示式程式碼挺清晰的,應該不需要多說,house和commercial的值設定為隨機生成對應的值。rotation值用於生成隨機的0,90,180,270的值。
順便,需要取消掉Transform using template point attribute
copy stamp值的使用
首先,先把rotation值用上 —— 新增一個transform節點,並且將rotationy
值設定為copy stamp
節點的rotation
變數值。
然後在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如下:
很簡單的物理模擬,static object用於地面box,rbdpackedobject設定為輸出的資料。
需要注意的是,把compute mass取消掉,因為這裡並不需要考慮質量。此外,記得把rotational stiffness歸0,地面的摩擦係數也要設為0.
針對於中心的引力,popvop設定如下,本質上只是一個很簡單的vector計算:
dopimport節點要進行DOP network和mask的設定。Import style要設定為Fetch Geometry from DOP network。
這樣一來就可以將最終的結果進行快取並且輸出了。可以選擇使用ROP節點輸出資料到磁碟資料,然後在需要的時候再讀入,也可以使用NULL節點並且進行Lock來進行快取,不過這樣整個檔案會大一些。
這裡選擇後一種方法,建立6個null節點,對每個節點,在物理模擬200幀後,進行lock操作,然後disconnect節點連線,就得到了快取資料。
最後的快取資料如下:
House聚簇:
Commercial聚簇:
之後就可以使用這些資料來生成point cloud了。
<全文完>