
不說廢話,先上個演示圖

主要原理(白話文):
假如你頭上是塊白色并且可以透視的平地,來了個非洲兄弟踩上面,你拿起單反對著上面拍了一張,照片如下

把腳印稍作翻轉(因為需要的是從上往下看的圖),然后用打印機打印照片,墊在黑人兄弟腳下之后得到

再試試用3D打印機,白色的地方堆高點,腳印的地方留個黑色凹槽,然后變成了

沒錯,原理就是這么簡單,你可以開始跟著做了。
完整實現:
1.先新建一個新的ThirdPerson藍圖項目,把建筑都刪掉,新建一個中心在原點的地形
(我們先把地形中心,人物,SceneCapture都放在原點位置,這樣翻轉UV的時候會好理解一點,后面我們再考慮上坐標的偏移)
- UE4的項目名和項目文件名一定要用英文,之前我的項目總文件夾名是中文,創建C++項目一直報錯
2.新建一個SceneCapture2D藍圖類,將SceneCaptur2D藍圖類拖入到場景中,設置坐標(0,0,-500),Y軸旋轉90度,這樣就使其在地面下并且鏡頭朝上了。
- SceneCapture2D:相當于一個相機,每幀拍一張照片提供給你,你可以拿來放到材質里或者直接擺UI上,大部分游戲的小地圖都是用這個做的
3.進入藍圖,將CaptureComponent2D組件的投射類型改為正交,寬度可以暫時設為2048(也就是之后雪地的最大寬度)

- 投射類型(Projection Type):
透視(Perspective)就是類似人眼,看到的是近大遠小。
正交(Orthographic)就像數學老師黑板上畫的效果,不會因為投影而改變物體比例。

4.在資源管理器中新建兩個RenderTarget,按1,2排序,2會用到。然后在CaptureComponent2D中綁定RendetTarget1,并將CaptureSource改為Final Color。
- RenderTarget(渲染目標):用來保存渲染的緩存,類似拍張照片存在這里。

5.新建一個材質名為Depth,將MaterialDomain改為Post Process(后期處理),添加到CaptureComponent2D的后效材質數組中

6.新建一個材質Snow,將其設置為Two Sided(兩面的),然后放到地形上。如果不設置成兩面的,等會在地形下方的相機就看不到地形,捕捉不到地形的場景深度。

7.Depth材質解析
- 記得先開啟Player的自定義深度
(關于自定義深度和相關材質基礎知識請先看這兩篇
[UE4藍圖][Materials]虛幻4中用自定義深度完整實現描邊材質(一) - 架狙只打腳
[UE4藍圖][Materials]虛幻4中用自定義深度完整實現描邊材質(二) - 架狙只打腳)

- 先介紹下Saturate節點,這個節點等同于Math.Clamp(0,1)。
當輸入值小于0時,輸出0。
當輸入值大于1時,輸出1。
當輸入值在0到1之間時,直接輸出這個值。 - 因為SceneCapture2D是從下往上拍的,所以獲得Player的自定義深度是大于場景深度的,也就是Player離相機的距離大于地面離相機的距離。
- 這里用(CustomDepth-SceneDepth)/自定義參數Depth=Result,那么有三種情況沒有人站的地方:CustomDepth為正無窮,所以Result為正無窮,Saturate處理后為1,顯示白色。人的腳底到離地面Depth高度的這一段(圖中紅色示意部分):CustomDepth大于SceneDepth并且小于參數Depth,所以Result為0~1的值,Saturate處理后值不變,那么根據離地越近的部分越黑。人從Depth高度往上的部分:Result為大于1的值,也是顯示白色。

8.現在新建一個UserInterface-WidgetBlueprint(控件藍圖),也就是一個UI界面,拖入一個Image,并將其的Image引用選為RenderTarget1,然后記得編譯。

9.打開一開始創建的SceneCapture2D藍圖,在GameBegin時將這個UI添加到視窗上。

現在運行游戲應該可以看到我們要的初步照片了

我們再把檢測的深度參數Depth由20改為200試試

(這里注意:這里相機從下往上每個像素點檢測到的自定義深度是取離相機最近的一個,也就是說從下往上看被腳掌擋住的部分,比如腳脖子,跟腱等等,檢測到的自定義深度就是腳掌離相機的距離,顯示黑色,只有在腳掌之外的部位被檢測到,才會顯示更淡的顏色。)
下一篇:
[UE4藍圖][Materials]虛幻4中可互動的雪地材質完整實現(二)?zhuanlan.zhihu.com