欢迎光临散文网 会员登陆 & 注册

叶随风动

2023-09-03 20:13 作者:尘星_Star  | 我要投稿

        这篇文章接着上篇文章,上篇文章基本把LBM这块的核心东西大致说了一遍。有了流体风场,自然就是如何使用了,今天就以风吹树叶来讲述这个方法的优势与不足。

        首先就是考虑如何对风场进行读取和写入,以便与其他的模块,诸于蓝图,材质亦或是其他Niagara进行沟通。

        沟通的媒介就是Render Target,我们需要存储空间的向量信息(这里一般是速度场,当然也可以存其他的,按需求来),把得到的速度场存在名为SimRT的Render Target 3D上,用Grid3D Collection这支“笔”进行写入。有了这些当然还不够了,我们还需要记录风场的信息。比如风场限于性能是有大小的,还要跟随角色移动(角色移动的的话,可以考虑实时传入角色的位置,基于位置算出角色的速度,流体按照角色的相反速度加上去就可以跟随角色移动,此处未实践,仅供参考),最重要的就是坐标的转换了,UE经常在Niagara中三个坐标系来回折腾,分别是最基础的世界(World)坐标,基于Niagara系统的本地(Local)坐标,还有就是Grid3D Collection,Render Target常用到的单位(Unit)坐标。

        为此官方在Grid 3D Gas Update Emitter模块中花了大量精力去进行各种数学运算来完成这些坐标系的转换。而且这个还比较重要,很多地方都会用到,像什么Neighbor Grid 3D也会出现,当然官方都写好了,直接拿出来用也一样,这些东西本来打算写一下的,但反过来一想还是把背后的数学知识推荐给大家吧。

        这里推荐上面的线代全集,以及下面的中间一集(Lecture 03 Transformation)看完总共就4个小时。如果线性代数只学过同济那本那就更加推荐上面的视频了,会对线性代数有着全新的理解。看完之后官方写的东西那就是小菜一碟洒洒水啦。

        

        这里用Render Target 2D要存五个关于风场的数据,注意Override Render Target Filter要用Nearest模式。为什么,直接放图比唠叨一大堆更加简洁明了。

Nearest
Bi-Linear

        我要存五个数,下面那个模式直接破坏了数据。不需要对数据进行奇怪操作。

        存了数据,接下来就是考虑如何读取了,目前只试过在材质和其他Niagara中采样数据,蓝图还没有试过。首先是材质:

Transform3*3Matrix
MF_SampleWindData

        把Render Target直接拽进材质里,连在SimRT之前的一大圈东西的目标只有一个,把世界坐标转换成Render Target里的坐标,换句话说假如处在风场的某个世界坐标(110,-151,111)在RenderTarget里的坐标可能就是(0.2,-0.15,0.11)这些数据只是个表象,方便大家理解,并不是真实的。所以包括后面Niagara里也有相同的操作,目的就是将前面的数转化成后面的数。至于其中还有涉及插值什么的,那是图像处理手段,这里就不赘述了。MF_SampleWindData这个就是读取风场相关的数据的。

        

        这个材质主要是Debug用的。本来在材质中我想试试风场对草的影响,如果不涉及交互的话,效果还是不错。但是一旦涉及交互,即我轻轻稍微移动一下交互物体,那么附近的草也会抖动,因为输入的风场速度,会随着交互物体每帧抖动,美术效果上看很奇怪。原因有两个,一个本身LBM只能模拟较小速度,我是倍增了速度。然后这种抖动随着倍增而增加,交互物体的速度远大于模拟速度。第二个就是为什么树叶能用了,树叶是把速度场作为力来看待,力本身突变对于位置的连续性没什么太大影响。树叶的交互就显的十分舒服自然。当然解决方法很多种,但都避开不了一个东西,需要添加额外的消耗。我本意是想通过这个风场,存两张RenderTarget然后影响所有东西,包括树叶,草,树,头发,布料也伴随着交互等等,但实际看来,还需要进一步研究。

        

        这就是在Niagara采样风场的模块了,其实和材质的是一模一样,只是处理方法不同罢了。这里就是把风场的速度作为风力来影响树叶。

        

        整个树叶模块还是比较简单的,没什么花里胡哨的,大部分都是系统自带的。

        对于树叶,落在地面上的交互效果,这部分也处理了很长时间,效果是只能说是差强人意吧。

Leaf Facing Correct By Speed

        

        这个模块就是树叶速度为0时,使其仰面向上。至于树叶落在地面还随着坡度的变化而变化可以做,但是为了这点效果所需的性能消耗就太大了,费半天力,别人还注意不到这种细节。这里Lerp Factor节点,可以调节树叶落地时,方向改变的快慢。有点反常识。但是仔细想想四元数以及Update是每帧都执行计算,就可以理解这个参数就是调节到目标四元数每帧旋转的程度。Make Quaternion from X and Y Vectors,这里XVector的方向就是垂直与叶片方向(把叶片近似的想象为一个平面),叶子落地,大部分叶子肯定不会竖着的,所以X Vector 的数值为(0,0,1)。当然这个数值还可以精修,看自己的需求了。比如加点随机值,上文提到的随坡度变化等等。Y Vector 给个随机值。目前树叶落地就是这样了。

Collision

        碰撞模块碰到了一些问题,之前碰撞采用GPU 距离场的,但是这种会随着碰撞次数增加会Kill掉树叶,你就会发现有些叶子会莫名其妙消失。打开一看,里面东西太多了,又偷懒不想自己写或者修改。就用Analyticals Plane凑活着用,这样粒子就不会莫名其妙消失了。

        其他的都是系统已经有的,模块加上去改改参数就行了,像Areodynamic Drag我都基本用的默认参数,官方默认的参数效果就不错了。至此树叶,不对Niagara就暂时到这里了。

叶随风动的评论 (共 条)

分享到微博请遵守国家法律