Houdini实时焦散与无缝动画无缝序列帧的烘焙
🦏

Houdini实时焦散与无缝动画无缝序列帧的烘焙

这里介绍一下houdini怎么烘焙无缝动画与无缝贴图,这两个无缝就是指时间上无缝循环与空间上的无缝循环。
这里以实时焦散为例子,制作一个焦散的无缝贴图,最后做成序列帧使用。
焦散的原理就是水的折射形成的,那么我们只需要在houdini里面把光在水中发生折射打到地面这个过程写出来就好。
notion image
这里我用grid创建了一个水面,在给这个水面给上uv,并且将水面细分一下,这里细分出来的每一个顶点都是我们光线的入射点,所以细分出的顶点数量越密集结果会越好,这里我给的细分为0.05到0.01之间,使用Mountain节点来简单的模拟水面波动(之后可以用ocean那一套)
有了水面之后我们还需要给一个水底,直接用grid创建一个平面当作水底接收光线。等下就可以将水底接收的光线保存下来,保存下来的结果就是焦散啦。
notion image
 
接下来便是使用vex来计算焦散来,输入0为水面,输入1为水底,假设光线入射方向为正上方先下(0,-1,0)。使用refract计算入射光线与法线的折射角度,IOR为1/1.33。
得到折射向量之后使用,模拟光线继续走打到水底,我们就直接用intersect函数根据折射方向发射线既可,如果打到水底那么就把当前点位置等于打中位置。
float index = ch("IOR"); vector dir = {0,-1,0}; vector p ; vector uvhit ; vector rn = refract(dir , normalize(@N), index); int pr = intersect(1,@P,100*rn,p,uvhit); if(pr != -1){ @P = p; }
notion image
之后再按照水底的位置与大小 创建一个一样大小的2D volume,这个volume就是等下我们要传入cop里面做贴图使用。
notion image
那么怎么把这些点转移到volum上勒,这里我们可以用volume rasterize particles ,嗯顾名思义就是用通过点云来光栅化volume,参数主要有三个,一个是我们需要写到那个属性,这里我们volume创建的属性为density,那么我们便写入density中。下面coverage scale一个是点云粒子强度缩放,particle scale为点云粒子范围强度缩放(这个值就用我们前面水面 remesh的密度就好)。
notion image
接下来我们便可以将这个2D volume 传入到Cop中输出图片,也可以再传入前对这个volume 做一些 增加对比度呀 模糊之类的自定义操作。
 
下面先讲无缝贴图的制作,然后再讲无缝动画的制作。

COP中制作无缝贴图:

有缝与无缝的本质其实就是一段连续的波形突然的变化剧烈,其实栅格化之后只能说离散后结果比较平滑变化不大,而出现有接缝的原因是波形两端值不一样导致两个像素之间跳变。解决方法便是用一段没有接缝的函数波形去替换有跳变的这一段曲线。
notion image
notion image
这是一个图像转化为波形大概是这样,Tile 2次
notion image
notion image
可以看见波形之间明显的跳变。
我们可以在跳变处插入一段连续的波形,当将要产生跳变的时候,我们过渡到没有跳变的波形上。我们还需要定义一个权重W来插值两个波形。
notion image
最终跳变区域波形将会变为一个平滑的过渡
notion image
将波形连续起来
notion image
便从一个跳变的函数变为连续的啦。反应到贴图上:
原贴图平铺两次(原函数两个周期)
notion image
衔接贴图(插值函数,其实就是原函数 offset半个周期既可)
notion image
权重函数
notion image
然后做一个权重混合(因为blend的0与1输入反了,所以我们勾选一下 Invert Blend Mask翻转一下)
notion image
最后我们在截取一下中间的图像
notion image
在tile试一下,确实没有跳变接缝啦。
notion image
如果 垂直也有接缝的话,可以在垂直做一次混合操作,上面全是原理,实际操作其实很简单,就是当前贴图offset偏移一下,在贴图tile跳变处淡入淡出偏移过后的贴图即可。操作可以简单粗暴随意实现。
 

SOP中制作无缝动画:

其实上面讲这些只不过为了让了解无缝的本质,接下来更好的体会知道无缝动画该怎么做,其实动画也遵循上面波形连续的原理。
我们可以使用TimeShift 来偏移我们的 波周期
notion image
在1到64帧的时间 一个波形的周期为 32->63 1-> 32 ,另一个波的周期为1 ->63 ,
一个最简单的设置,基于64帧,这个可以直接用Labs的make_loop节点也行。
notion image