美文网首页
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