ue4 改变枢轴位置_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(二)

ae94367c822460d824b5b50ff7b2d568.png

上一篇:

[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)​zhuanlan.zhihu.com
a2be662eef5d8c245a8812005980c334.png

10.新建一个MaterialParameterCollection(材质参数集)并添加一个Scalar参数OrthoWidth。
并在SceneCapture蓝图类的BeginPlay事件中将CaptureComponent的OrthoWidth赋给它。

569c6466c39679b1c275746852d9edfe.png
添加OrthoWidth参数到MPC中

3befb340efce2f47847353120cc2f65a.png
将CaptureComponent的OrthoWidth值赋给MPC中的OrthoWidth
  • MaterialParameterCollection(材质参数集):可以存储两种参数,一种是标量参数(ScalarParameter)也就是一个浮点值,一种是矢量参数(VectorParameter)(包含四通道矢量值即4 个浮点值)。在这里存储后,可以在所有材质中直接获取,适合用来做统一控制,导入全局数据等等。
  • OrthoWidth的作用:CaptureComponent的OrthoWidth是相机正交拍摄的宽度,比如设置的是512,那么拍摄的范围就是以(-256,-256)(256,-256)(-256,256)(256,256)为四个顶点的正方形区域。
    那么我们现在得到了一张正方形照片了,我们需要打印到地面上,并且每个点对应上,就需要通过UV坐标每个像素一一对应了,有了OrthoWidth,我们就能通过地形上的每个点的世界坐标(这里只需要x,y就行了)算出对应的UV坐标,再去照片上获取这个点该有的颜色。
  • 此篇重点!详细图解计算UV:先解释下这张图。
    这是一张以世界原点(0,0,0)为中心的俯拍图,主角是一个圆柱体,坐标为(1,3)。
    那么根据图你应该可以看出,这里的OrthoWidth是10红色为世界坐标系(俯视角),横y轴,竖x轴(UE4为左手坐标系,x轴向前,y轴向右)黑色则为UV坐标系,原点在左上角,横为U,竖为V。蓝色圆圈则是SceneCapture从下方拍摄获取到的照片中,圆柱体应该在的位置。
    (镜头本来朝着X轴正方向,绕Y轴旋转90°后,俯视角为右上角的圆柱体就变到右下角了,这里需要一点空间想象或者自己在场景里拿个相机试一下就懂了)
    我们的目标就是 通过圆柱体的世界坐标获得它在所拍摄图片上所在位置的UV坐标,也就是蓝色圆圈的UV坐标。
    我们先通过圆柱体的世界坐标(1,3)来计算它的UV坐标:
    U1=(3+5)/10=0.8 V1=(5-1)/10=0.4
    将数字替换为x,y,OrthoWidth之后得到公式:U1=y/OrthoWidth+0.5 V1=0.5-x/OrthoWidth
    那么蓝色圆圈的UV坐标为U2=U1=y/OrthoWidth+0.5 V2=1-V1=x/OrthoWidth+0.5

55e3cad25dd2775d70d6569fce8824a1.png

11.在Snow材质中使用刚才获得的公式实现所谓的2D打印

40f5124dfc07a0ac770a174832ec91e9.png
这里的TextureSample中的Texture当然是选择RenderTarget1了
  • TextureSample表达式用来输出纹理中的颜色值。此纹理可以是常规Texture2D(包括法线贴图)、立方体贴图或电影纹理等等。
  • CollectionParameter可以获取到任意材质参数集中的参数。

这里我们MakeFloat2那里UV的值故意连反了,应该U对应着y,V对应着X的。
我们先看一下效果

8e6d92611544acfbe200ac6f0fb78fa4.gif
当地形比OrthoWidth大很多时,就会印上很多脚印,不用担心,最后我们调整好地形大小就好了

因为脚印不反的时候,很容易看不到,正好被完全挡住了,所以先确定一下脚印有没有正常被打印在地形上。

  • 如果你看到的脚印很模糊,像个长方形,那么你可以调大RenderTarget1的尺寸比如1024(记得将RenderTarget2的也调为一样的),脚印清晰程度跟OrthoWidth和RenderTarget尺寸的比例有关。当然,这两个值越大,性能消耗就越大。

01484572324e8e51c5cb1d31958d797a.png

现在我们把UV与XY的对应关系顺过来

1f827078dcc56a86a23996350edafe49.png
只改MakeFloat2这里即可

再进入游戏

497612c3f8895c9581f698500e58efea.gif
脚下的脚印被挡住了,方向正确

12.在Snow材质中开启Tessellation(曲面细分)

  • Tessellation(曲面细分):曲面细分是DirectX11的一个功能。可以在运行时将各个三角形(场景中的一切都是有一个个三角形拼起来的)切分成更小的三角形,这样我们就能控制更多顶点,让画面更加细节。
    这里我们使用Flat Tessellation

49bc2ff736b2e388ba3b2e91e8f4825a.png

915537819fbe05d42b28c4f2770e1c56.png
PN Triangles跟Flat Tesselation比起来更加平滑

13.在Snow材质中控制顶点的偏移,这里会详细解释,看图

7ae7d59bdf153ffb6362e9c166a5bdcc.png
  • VertexNormalWS(顶点全局空间法线):可以获得到当前这个点的法线,也就是垂直于地面的单位向量,假如地形是平的,那么每个点获得的值都是(0,0,1)。
  • WorldDisplacement(世界位移):只有开启了Tessellation后才可以使用,可以控制所有顶点的位移,一般都是配合VertexNormalWS使用。
  • World Position Offset:跟WorldDisplacement功能一样,开不开启Tessellation都可以使用,但是只能控制基本顶点,也就是说曲面细分后新增的那些顶点,是只能通过WorldDisplacement控制的。
  • Tessellation Multiplier(多边形细分乘数):这个数值越大,分的就越细,三角片就越多,顶点也就越多,性能消耗更高,这里就设为2了。
  • 这里取R值(白色即为1,黑色即为0),乘以一个自定义参数Height(雪地的最大厚度),再乘以单位法向量,得到的就是每个顶点需要的偏移量了。那么脚底的部分为黑色,偏移量为0,其他地方为白色,则是沿法线方向偏移Height个单位,假如是平坦地形的话,则是竖直向上偏移,也就是地面被拔高了。

现在进入游戏看下效果

361ef68cb3e39275a3c8abdf672198e1.gif

3D打印已经生效了,并且从下面看就很容易理解我们刚才做了什么了。我们让脚部的顶点不变,抬高了其他的部分,这样看起来就踩在雪上了。

  • 解决地面闪烁问题
    如果这时候你的地面有时候会一闪一闪的,是很正常的,因为我们没有调整地形的Bounds Bounds(边界): 每个静态网格和骨架网格都有Bounds,相机通过Bounds来决定剔除遮挡。简单地说,当相机看到了Bounds,这个物体才会被渲染,否则就算应该在视野内,也看不见。
    而这里我们的地形被拉高了,但是Bounds并没有改变,所以就会出现剔除遮挡出现错误。
    简而言之,Bounds最好是只能大,不能小
    我们可以勾选Show-Advanced-Bounds,这样就能看到物体的bounds了。

b290dc311929d65236a980aa3cf2843e.png

选中地形,然后更改Positive ZBounds Extension的值,可以看到Bounds的变化

241f6d4035c85b19ce8e50fe91c24e4b.gif

Positive ZBounds Extension表示在Z正半轴上增大边界,Negative ZBounds Extension表示在Z负半轴上增大边界。
所以我们将Positive ZBounds Extension改为100就不会出现闪烁的问题了。

后面我们会解决如何留下脚印和SceneCapture不在原点的情况下如何计算等等问题。

下一篇:

[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(三)(完结)​zhuanlan.zhihu.com
c7e43d6a33cb7df4cb7847faf642c098.png

感谢关注评论点赞收藏!有问题请评论或私信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值