Houdini技術體系 基礎管線(二) :Heightfiled與UE4的無縫導入以及對World Composition的支持

Authored by TraceYang

前言

   傳統的製做作比較真實大世界3D關卡地形時,一般的採用的方式是把HeightMap和SplatMap(Layer Mask)導入到引擎的地形系統裏,生成Terrain LandScape的地形信息和地表材質的圖層信息。再由美術在引擎編輯器作進一步的細化工做。而這些Map的生成,是使用WorldMachine(簡稱WM)軟件來製做的。

圖爲Ghost Recon Wildlands前期使用WolrdMachine製做的地圖

圖 除了HeightMap以外,SplatMap也是要從World Machine中生成的
從WorldMachine中Bake出Map後,導入到UE4引擎裏,這個教程wiki上比較多,就很少作描述了。

圖 把Map導入到UE生成的Landscape

可是傳統的WM機制一般會有如下幾個問題
  • WM裏預覽的地形生成效果跟DCC軟件或遊戲引擎相比並不美觀,也不能像其餘工具裏直接由美術參與修改
  • WM導入到引擎須要經過導出Heightmap再導入引擎,當地形比較大時,map生成和寫入到硬盤的時間會超過10分鐘,對美術迭代修改的成本很是大
  • WM生成後到引擎後,關卡設計還須要在地形上進行二次開發,從而影響到地形和地表的Map,這時若是須要WM生成部分地形時,整個流程會變的很是混亂。

像Ubisoft在近年來的大世界項目,Ghost Recon Wildlands和FarCry5如裏引入了Houdini Pipeline技術,GDCVault上都有介紹,具體的Heightfield替換WorldMachine的製做,會在地形篇提到,管線章節裏就很少作敘述了。這裏假設你已經用Houdini的HeightField製做了地形,接下來看下怎麼可以快速的經過Houdini Engine快速的導入到遊戲編輯器裏。

Houdini HeightFiled 到UE4 Landscape的無縫生成

下圖是Houdini HieghtFiled到UE4 Landscape的無縫生成的結果示例,不須要導入貼圖,只需把HDA文件拖入到編輯器的Viewport,賦予預製做好的Landscape材質,就能夠自動把HDA Cook成UE的landscape資源。 這裏假定假定讀者已經掌握 Landscape Material和Landscape Layer的建立方法,就很少作敘述了。
從Houdini Engine的機制圖能夠看到。咱們就是經過HDA文件 Houdini HeightFiled的每個volume的信息轉入到UE4裏,這裏UE4 Houdini Engine Plugin已經實現了功能幫咱們作轉換

首先這裏要要讓HeightField的Size的設置和最終在UE4裏Bake的Landscape Sizes一致。下圖是UE官方建議的 Landscape的配置。
HDA文件導入到場景後,這裏能夠看到Landscape 的 Component的狀況。

管線介紹部分不會對Heighfiled的製做作太多介紹,用Houdini生成地形信息,一般是用兩種途徑:
方法一: 使用HeightField File節點加載一張已有的高度圖來生成
HeightField File 節點裏能夠配置生成到UE4的Landscape的Size
而具體的對應的UE Landscape的 Overall Resultion,可使用Heightfiled Resample節點
而GridSpacing則對應的是他實際在UE4裏的Overall Resultion
Heighfiled的 Grid Spacing比較大時,說明一樣大小的地形,對應的更少的頂點,換算到UE裏,就是比較小的Landscape Overall Resultion。 Overall Resultion越小,UE裏Landscape生成後的頂點數也會更少一些。這樣適合在移動終端用較少的資源作出相對比較大的場景。
下面我作幾組Height Field Size與UE Landscape Componment的對比,他們最終在UE裏的Landscape szie都是8129x8129。只是細節有所不一樣。

    業餘學習中咱們能把Houdini Engine做爲一個黑盒,根據需求來作Size和 Grid Spacing的組合來達到想要的目標配置,而真正項目工程裏,仍是建議由引擎程序根據項目來定製Hengine Engine的Cook Landscape的配置。這個咱們在後續的定製更新和修改時也會提到。
方法二:使用Heightfiled節點從0開始生成:
建立這個節點時,就能夠選擇整個地圖的尺寸,其中Size就是爲導入到UE4後對應的大小, 和方法一同樣Grid Spacing來決定 Overall Resultion。
其餘的就跟方法一是同樣的了。 這樣,就能夠根據機器性能,在場景用較低的幾何體生成出相對較大的場景。
Heightmap的導入解決了,而後就是HeightField Layer Mask與UE4 Landscape Material Layer的對應設置。
上圖中HDA裏 HeightFiled的volume信息,height對應的就是HeightMap信息,這個Houdini Engine已經自動支持了,而其餘的Layer Mask與UE的Landscape Material Layer,則能夠經過命名來一一對應。

這裏咱們讓HeightField的Layer Name與UE的Landscape Layer Name保持一直。
左側的Heithfiled Layer名稱和右邊UE的Landscape移植,就能夠經過Houdini Engine,不導出中間的Map資源,這個過程相比WM的10幾分鐘要快不少,一般HDA的Cook只要10幾秒。
具體的製做過程能夠看附件的HDA事例,這裏只介紹幾個Houdini關鍵節點的使用。
HeightField Copy Layer的功能就是把你在Houdini裏生成的Layer Mask重命名爲你想在UE引擎裏對應的Landscape Layer的名字。
這樣,咱們能夠從HDA文件直接生成出帶地形高度和地表圖層信息的場景了。

Houdini HeightFiled 對World Composition的支持

     無縫大世界遊戲場景開發中,一個Landscape不論是在多人協做開發,迭代,仍是在Streaming的優化以及打包等,諸多方面都會有不少的不便,因此須要咱們把一個大世界的Landscape‘Tile化’。好比一個8x8km的Landscpe可能會切成4x4或8x8的Tile。UE也提供了World Composition的功能。
傳統WorldMachine裏能夠經過Tiled build生成出無縫的Tiled Heightmap和Mask,而後import到UE的Landscape裏,這樣其實也會增長bake時間,另外把UE4 Landscape的Mask導回給Houdini也是很痛苦的事情(很慢,須要很是大的系統內存)。

好在Houdini 16.5版本後,其實對這部分的支持也增強了,Houdini提供了一個heightfield tilesplit節點就能夠作Tile化了,這裏我切成了4x4個tile。
再次把HDA加入場景Cook。就能夠生成4x4=16個tile的Landscape了。
可是這個用heightfield tilesplit的方法有他的缺陷,一個是會在tile上產生邊緣產生接縫露空。
   並且這種多個 Landscape的方式,和UE4的World Composition機制也有衝突。也不能跨Tile來作地形編輯,其實並非作無縫大世界地圖的正確方法。 其實World Composition仍是一個總體Landscape,經過把 LandscapeStreamingProxy分配到每一個子關卡的方式,來進行的Tile分割。
這裏提供一個不修改Houdini Engine也能快速的使用World Composition的比較笨的人力辦法來解決。
首先,咱們不使用splite節點,直接導入一整張地圖進來,這樣確定是沒有接縫的。
而後相似建立出對應個子關卡,這裏假定咱們生成2x2的。
接下來,咱們選擇對應的sublevel,用Move to level工具,就能夠把對應的Landscape Component移動到指定的Level裏,生成一個LandscapeStreamingProxy
最後給每一個Level生成對應的 LandscapeStreamingProxy。進行保存。
而後刪除掉原始的Landscape,刪除以前建立的SubLevel,
勾選Enable  World Composition。
UE4就會自動的幫你加載以前的sublevel,生成 World Composition。
這樣就和UE4默認的Import tiled map生成的 World Composition是同樣的了。
    和前面的地形尺寸對應同樣,這裏正確的方法實際上是要修改Houdini Engine裏面的Bake機制,參考 Import tiled map裏代碼的方法,自動的建立關卡和分配Landscape Component,實現整個流程的自動化。不然未來的迭代也會成爲問題。

後續問題

雖然這裏看似Houdini HeightFiled to UE4 Landscape的流程已經打通,可是在實際項目開發中仍是會有如下幾個問題
  • 目前流程中Heightfiled仍是總體的修改和導入,沒法支持Landscape Component和Section的更小級別的增量更新
  • 還要考慮World Composition的支持,能夠自動的從Landscape的某個單元更新到LandscapeStreamingProxy
  • 後續的基於地形的植被自動生成,山體自動建模等等的生成功能,也是要支持Landscape的最小單元。
  • 對應手遊的硬件的考慮,還須要要能生成不一樣細節的資源等。
  • 最重要的,要把這流程作成引擎內的閉環,讓開發人員不須要了解Houdini就能UE4裏執行和調用功能。

另外Unity雖然沒有說起,但相對實現應該跟UE4相似,並且也能夠將Heightfile轉換爲Terrain Mesh來適配移動設備,這裏就很少作介紹了。而上面描述的問題,會在從此的分享中有所解答。關於本文的事例資源會在近期提供一個分享專用的git地址。
相關文章
相關標籤/搜索