美文网首页
UE4学习008——流体示例详解

UE4学习008——流体示例详解

作者: cdf02aaf6ae2 | 来源:发表于2018-09-03 17:15 被阅读279次

简介

这是一个用 RenderTarget 模拟水波效果的简单示例,波纹高度模拟和波纹法线计算设计的很巧妙

官方示例说明

官方说明只讲了建立工程的步骤及相关 Blueprint 中的设定,但没有解释其中的原理,此文根据我自己的理解加以说明

RenderTarget

RenderTarget 其实就是一般 3D 渲染概念中的显卡模板缓冲区,可以缓存渲染数据,而 UE4 将其进行了封装,让我们可以方便地用 Blueprint 进行操作,比如绘图

此示例使用了 4 个 RenderTarget,其中 3 个循环使用,以模拟计算波纹高度,另一个用于计算波纹法线

参数值由来

  • 0.003906

    此值在高度模拟和法线计算时都有使用,这个值不是随便来的

    此例中使用的 RenderTarget 尺寸都是 512*512,而纹理空间 UV 的取值范围是 [0, 1],所以每一个像素的大小为 0.001953

    此值即是两个像素的大小

  • 0.02

    基于上面的计算,此值约等于 10 个像素的大小

初始施加力

这部分是相对最简单的,就是把鼠标位置映射到纹理空间中的一个点,然后针对每一个像素,根据到此点的距离,线性换算成一个高度值,存入纹理的 R 通道

简单点说就是:

//0.02 - distance 还被约束到范围 [0,1]
h = (0.02 - distance) / 0.02

波纹高度模拟计算

此部分相对是最难的,使用了三个 RenderTarget,对应前一帧、当前帧、下一帧,循环进行模拟

每一帧对每一个像素,使用当前帧的高度图,采样其前后左右四个点,计算出均值并取一半作为此像素的变化趋势

然后减去再前一帧的高度,作为下一帧的高度值,存入纹理的 R 通道

  • 问题1

    按照这种模拟计算,由于开始的时候没有再前一帧的数据,导致一开始的几帧,纹理中心部分的高度其实是继续上升的,但很快会降下来,可以通过下面心得部分的方法进行验证

  • 问题2

    此处结合两帧的数据,用当前帧计算均势,再应用到前一帧作为下一帧的高度,这个设计很巧妙

    大家可以尝试改成只用当前高度加上趋势进行计算,可以看出其中差异

波纹法线计算

此部分看起来挺难的,道理说透了,其实也简单

跟高度计算类似,对当前帧高度数据的每一个像素,采样其前后左右四个点,前减后,左减右,得到两个十字相交的向量

然后计算向量叉乘,得到的向量作为此点的法线方向

心得

可以通过修改 WaterSurface_BP 中的 UpdateRate 参数,比如改成 5,以较慢的速度看每一帧流体表面的变化

相关文章

网友评论

      本文标题:UE4学习008——流体示例详解

      本文链接:https://www.haomeiwen.com/subject/vzciwftx.html