【教程】vex种实现turbulence vop的功能

——  微资讯 · 微课程  ——

利用零碎时间,走上超神之路!


简介

我们在使用noise的时候大部分都是使用vop而不是vex,主要原因在于vop在的noise类型节点提供了大量便捷的控制参数,而默认的noise vex函数只有最基本的noise形态,如果要实现vop种功能还有手动增加特定的控制。当然,有些时候我们必须在wrangle中实现noise的设置,那么本小节就使用wrangle还原turbulencenoise中的参数控制。

第一步 最核心的点要清晰的知道对应的参数的真正意义(而不是表面翻译)

noise type 就是基本的noise的形态,这个对应vex中就是不同的noise类型函数。

Position 位置,也就是输入的三维矢量(一般作为驱动量),在noise中大部分情况使用@P作为输入的参数。

剩下就是需要还原的参数类型

Frequency 翻译是频率,实际上就是对@P这个量的倍增

Offset 翻译是偏移,这个主要是指的是X轴的横向偏移,也就是对@P的叠加

Ampitude 翻译是强度,实际上是对noise()结果的倍增缩放,是y轴的缩放量

当然,这里还可以添加一个y轴的偏移或者是fit range适配,这个可以还原uniform noise的部分参数控制功能。

上面这个其实和houdini之道vopvex卷基础数学卷中讲解y=sin(ax+b)*c+d这个三角函数的终极变体是一样的。

这里最让人困惑的是roughness和turbulence

roughness直接翻译是粗糙度,turbulence直接翻译是紊乱,到底指代什么呢?
实际上turbulence是noise叠加的次数(从0/1开始叠加)也就是如果把noise设置为0或者1(不同noisetype不同)就是还原为noise的最基本的形态,也就是vex中noise函数的最基本形态。此时roughness无论如何调整都无效,那么说明roughness是在turbulence基础上的起作用。
roughness具体指代是每迭代一层noise之后强度的缩放,也就是第一层nosie默认为1,第二层noise为0.5,第三层noise为0.5*0.5=0.25.如果把ruoughness设置为1,那么每一层的强度都一样,那么最后叠加的感觉就非常的“粗糙",如果设置为0,等价于没有叠加,只有最基础一层的效果。

当然,这里还有一个隐藏的变量,就是每次叠加noise的时候frequency会做固定倍增,以及offset会做固定位移,对于turbulence vop中,这两个量是一样的,默认是是2.01234,我们可以简化为2。这个在vop中是内置的,无法控制,但是我们使用wrangle就可以单独设置这个变量,包括让frequency和offset的这个变化不一样都可以。

第二步 在wrangle中实现

1找到对应的noisetype类型,关于houdini中的noise类型完全讲解以及对应的noise vex函数都在houdini之道 vopvex卷的第九章完全讲解。这里我们选择perlin noise类型。

2wrangle中的设置 @P.y=noise(@P);

基本搭建对比,绿色为左边使用turbulence vop,蓝色为右边wrangle函数,transform向下偏移0.2个单位作为对比

turbulence参数都提取出去,noisetype=perlin noise,turbulence=1

这时候wrangle和turbulence vop是完全一致的。

3设置Frequency,offset和amplitude的控制

vector freq=chv("frequency");//定义了频率

vector offset=chv("offset");//定义了偏移

float amp=chf("amplitude");//定义 了强度

@P.y=noise(@P*freq-offset)*amp;

这里需要注意两点 1 frequency和offset是矢量,amplitude是浮点。2 offset要和vop中完全匹配用的是减法而不是加法。这时候vop和wrangle同时改变对应的参数结果完全是一样的

4 处理turbulence叠加的问题,这里涉及三个参数 1叠加次数turublence 2每次叠加turbulence的强度倍增roughness 3frequency和offset的变化量n。由于要重复叠加控制,我们使用的是for循环。

vector freq=chv("frequency");

vector offset=chv("offset");

float amp=chf("amplitude");

int  turbulence=chi("turbulence");//定义迭代次数

float rough=chf("roughness");//定义每次叠加强度缩放值

float n=chf("n");//定义了每次叠加offset和frequency的倍增量

float sum=0; //初始化叠加结果值为0

for(int i=0;i<turbulence;i++){

sum+=noise(@P*freq*pow(n,i)-offset*pow(n,i))*amp*pow(rough,i);

}

@P.y=sum;

得到与vop完全一样的结果。

注意点:

1noise类型要一样,并且不同的noise类型紊乱初始迭代次数值不一样,有的是0,有的是1,那么这个直接决定了for循环中 i 的初始值。

2对于频率和offset 的倍增值默认值设置为2,当然,使用wrangle设置noise我们可以让他们两者不一样,而且可以调整这个倍增量(不为2),自由度比turbulencevop更高。

3基于这种学习方法,对于更加复杂的uniform noise节点(mountain sop和hf noise sop的本质节点),我们在后面的课程里面也会通过这种基本算法进行还原,比如fold,bias,complement等等,让大家不只是停留在字面翻译层面,学习目的是不仅正确理解和运用,还可以通过自定义拓展,自定义获得更加大的自由。

视频展示

教程编号CGhunter_houdini_04_09_003_noise(vex卷第九章random,noise完全讲解章节第三集)

重要信息

(0)

相关推荐