第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第1张图片

▉ 要抵达上天对所有梦想执着者的应许之地!抵达那流淌着奶和蜜的地方。要翻过一座座山丘。趟过一条条河流。— 每天翻译一篇教程,这就是我写给houdini的情书。

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第2张图片

█天空之城:梦想之旅才是真正的自由行,不需要如何签证和通行证。

前言不搭后语:

 故乡容不下梦想,于是我长途跋涉,从家乡到他乡。然后辗转反侧20年后,青春就要褪色,却仍不肯放弃看似毫无希望的梦想,我就是忘不掉出发时的初心,那片梦想之地就是我的信仰,这就是我在很多同时期身边人,甚至很多后辈都财富自由,都过上退休生活的年纪,仍在孤军奋战的原因。因为我知道那个世界超越世俗的一切,没有现实的枷锁,是天马行空真正的自由世界,这不是能用财富,地位所能衡量的。它超越所有的世间的奖励。

       我不会放弃,今生一定要找到它,也一定会找到它,然后把它描绘出来。

今天这节的内容:

    如何快速制作不同振动点在水面形成的“干涉模式”


这一节要实现的效果

.....

▉今天是42岁第034天周三

这是写给houdini的

第060封“情书”

我是geo流程图

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第3张图片

我是vex代码

1 找到grid上点距离所有振子的距离&最大距离

//-----------准备工作-----------

//-- 1 究竟有多少振子;可以用nearpoint,但npoints函数计算量更小

int totalpts = npoints(1);

//-- 2 储存每个振子距离的浮点数组

float dists[];

//-- 3 最大距离初始化,找出最远的那个振子

float maxd = 0.0;

//------------开始工作------------

for(int i =0; i

    //-- 首先 提取每个点的位置

    vector npos = point(1, "P", i);

    //-- 然后是当前距离:活跃点 -> 找到的振子

    float dist = distance(v@P,npos);

    //-- 放入dist数组

    push(dists,dist);

    //-- 判断:dist > dists数组中的距离,此距离为“新的最大距离”,

    if(dist > maxd){

        maxd = dist;

    }

}

//-------------结束工作-----------

f[]@dists = dists;  //-- 存储数组

f@maxd = maxd;      //-- 存储最大距离

2  {每个正弦幅度}并{y轴相加置换}

//-----------准备工作------------

//-- 1 首先 振子频率:创建一个浮点滑杆参数 = 55

float freq = chf("Freqency");

//-- 2 接着 导入数组:存储的点属性-到振子上所有距离,稍后导入全局maxd

float dists[] = f[]@dists;

//-- 3 导入全局maxd 使用detailhan数访问

//float maxd = detail(0,"maxd");

//-- 8 降低最大距离

float maxd = detail(0,"maxd")*0.25;

//-- 4 振幅

float amp = 0;

//------------开始工作------------

//来自每个振荡器的每个波前的各个振幅,以及那些波前的一些波形,foreach计算它们。

foreach(float dist; dists){

    //-- 4 此时没有衰减,它们保持着固定的强度;

    //-- 5 没有衰减,除非加入强度变量,到这一点每一种方式的振幅,

    //-- 7 fit函数适配距离:当前激活点->每个振子

    float strength = fit(dist,0,maxd,1,0);

    //-- 1 波前公式=sin(当前距离*频率)+再加入amp值;

    // amp += sin(dist*freq);

    //-- 3*0.01。因为没有阻尼的作用,乘一个数降低幅度

    //amp += sin(dist*freq)*0.01;  

    //-- 6 使用strength取代常数

    //amp += sin(dist*freq)*strength;

    //-- 9 再创建浮动滑块

    amp += sin(dist*freq)*strength*chf("Displacement");

}

//-------------结束工作-----------

//-- 2 测试: 沿y轴置换的点位置

 v@P += set(0,amp,0);

本节需要注意的知识点:

1

建立振动点 

1)circle撒几个点,作为激活点;

2)建立grid作为水平面,作为激活点几何体; 

2

找到”所有的振子““点与振子的距离”存储在网格的每个点上

3) pointwrangle1节点:连接起水面和激活点

---准备变量---

    a)npoints函数找到所有振子,计算量更小

int

totalpts = npoints(1);

    b)储存每个振子距离数组 : float

dists[];

c)找出最远振子的最大距离float

maxd = 0.0;

-----开始工作-----

for(int

i =0; i

a)首先提取每个点的位置 vector npos = point(1, "P", i);

b)然后活跃点 -> 找到的振子的距离:   float dist = distance(v@P,npos);

    c)距离放入dist数组push(dists,dist);

    d)判断:dist > dists数组中的距离,此距离为“新的最大距离”,

    if(dist > maxd){

        maxd = dist;

---输出:距离属性&最大距离---

f[]@dists

= dists;  //-- 存储数组

f@maxd

= maxd;      //-- 存储最大距离

3

最后求{每个正玄}并{相加}形成干涉图

4)pointwrangle2:获取每个点的{每个正弦幅度}并{y轴相加置换}

---准备变量---

1)首先 振子频率:创建一个浮点滑杆参数 =55

float

freq = chf("Freqency");

2)接着 导入数组:存储的点属性-到振子上所有距离,稍后导入全局maxd

float

dists[] = f[]@dists;

3)导入全局maxd 使用detailhan数访问

//floatmaxd = detail(0,"maxd");

 7)降低最大距离:floatmaxd = detail(0,"maxd")*0.25;

 4)振幅 :float

amp = 0;

---开始工作---

//获得每个振荡器的波前振幅,以及那些波前的一些波形,并为foreach计算它们。

foreach(float

dist; dists){

    //--4 此时没有衰减,它们保持着固定的强度;

    //--

5 没有衰减,除非加入强度变量,到这一点每一种方式的振幅,

//-- 7 fit函数适配距离:当前激活点->每个振子

float

strength = fit(dist,0,maxd,1,0);

    //-- 1 波前公式=sin(当前距离*频率)+再加入amp值;

  //amp += sin(dist*freq);

    //-- 3*0.01。因为没有阻尼的作用,乘一个数降低幅度

    //amp

+= sin(dist*freq)*0.01;  

    //-- 6 使用strength取代常数

    //amp

+= sin(dist*freq)*strength;

    //-- 8 再创建浮动滑块

    amp

+= sin(dist*freq)*strength*chf("Displacement");

}

//-------------结束工作-----------

//--2 测试: 沿y轴置换的点位置

 v@P += set(0,amp,0);

接下来

理论部分

1:干扰图案

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第4张图片

01) 想象在水的表面上,有浮标上下移动,这就产生了波浪。

02)中间互相抵消,叫做破坏性干扰模式!

03)建设性放大,产生波的形状,波浪的起伏幅度取决于两个振子的位置,距离和震荡频率。

我们想计算网格红点的振幅

04)假设它们的频率是相同的

        我们需要知道

        a) 有多少振荡器

        b) 它们的频率

        c) 到每个振荡器的距离

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第5张图片

05)公式

06)最终强度:

07)我们只要将两个波前强度结合起来 就可以给我们最后的整体力量,这会产生有趣的干扰模式!

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第6张图片

接下来

开始正式制作

使用软件houdini16.5

1:建立振动点

1)Grid // 尺寸:2*2; Rows:500; Columns:500;

// 创建一些点作为振子。现在画一个圆

2)Circle // 轴向:ZX Plane;大小:0.5

// 撒11个点,每个点是一个振子;

3)scatter  // 数量:11;取消Relax 

2:找到”所有的振子““点与振子的距离”存储在网格的每个点上

4):pointwrangle1  // 

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第7张图片

//-----------准备工作-----------

//-- 1 究竟有多少振子;可以用nearpoint,但npoints函数计算量更小

int totalpts = npoints(1);

//-- 2 储存每个振子距离的浮点数组

float dists[];

//-- 3 最大距离初始化,找出最远的那个振子

float maxd = 0.0;

//------------开始工作------------

for(int i =0; i

    //-- 首先 提取每个点的位置

    vector npos = point(1, "P", i);

    //-- 然后是当前距离:活跃点 -> 找到的振子

    float dist = distance(v@P,npos);

    //-- 放入dist数组

    push(dists,dist);

    //-- 判断:dist > dists数组中的距离,此距离为“新的最大距离”,

    if(dist > maxd){

        maxd = dist;

    }

}

//-------------结束工作-----------

f[]@dists = dists;  //-- 存储数组

f@maxd = maxd;      //-- 存储最大距离

----以上只是为了模拟衰减;因为在水中的任何介质都会受到阻尼,所以它会变弱。

5)attribpromote1  // 

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第8张图片

    a)  转成detail属性,仅有一个值,也就是将之前储存的所有maxd最大值,这是maxd的全局最大值;

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第9张图片

3:最后求{每个正玄}并{相加}形成干涉图

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第10张图片

6)pointwrangle2  // 

//-----------准备工作------------

//-- 1 首先 振子频率:创建一个浮点滑杆参数 = 55

float freq = chf("Freqency");

//-- 2 接着 导入数组:存储的点属性-到振子上所有距离,稍后导入全局maxd

float dists[] = f[]@dists;

//-- 3 导入全局maxd 使用detailhan数访问

//float maxd = detail(0,"maxd");

//-- 7 降低最大距离

float maxd = detail(0,"maxd")*0.25;

//-- 4 振幅

float amp = 0;

//------------开始工作------------

//来自每个振荡器的每个波前的各个振幅,以及那些波前的一些波形,并为每个环路计算它们。

foreach(float dist; dists){

    //-- 4 此时没有衰减,它们保持着固定的强度;

    //-- 5 没有衰减,除非加入强度变量,到这一点每一种方式的振幅,

    //fit函数适配距离:当前激活点->每个振子

    float strength = fit(dist,0,maxd,1,0);

    //-- 1 波前公式=sin(当前距离*频率)+再加入amp值;

    // amp += sin(dist*freq);

    //-- 3*0.01。因为没有阻尼的作用,乘一个数降低幅度

    //amp += sin(dist*freq)*0.01;  

    //-- 6 使用strength取代常数

    //amp += sin(dist*freq)*strength;

    //-- 8 再创建浮动滑块

    amp += sin(dist*freq)*strength*chf("Displacement");

}

//-------------结束工作-----------

//-- 2 测试: 沿y轴置换的点位置

 v@P += set(0,amp,0);

7):   //  给“振幅*0.25”的效果

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第11张图片

8):   // 给“最大距离maxd*0.25”的效果

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第12张图片

a);

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第13张图片

今天就到这儿了,收功

教程翻译自entagma的网络教程

下一节:Quicktip: Signed Distance Outlines

第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第14张图片
第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018_第15张图片

     本文图片全部原创,版权归原作者所有

你可能感兴趣的:(第060封“情书”:越过山丘理想国 Interference Patterns using VEX<Entagma>Houdini 2018)