不说废话,先上个演示图
主要原理(白话文):
假如你头上是块白色并且可以透视的平地,来了个非洲兄弟踩上面,你拿起单反对着上面拍了一张,照片如下
把脚印稍作翻转(因为需要的是从上往下看的图),然后用打印机打印照片,垫在黑人兄弟脚下之后得到
再试试用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