▉ 要抵达上天对所有梦想执着者的应许之地!抵达那流淌着奶和蜜的地方。要翻过一座座山丘。趟过一条条河流。— 每天翻译一篇教程,这就是我写给houdini的情书。
█天空之城:梦想之旅才是真正的自由行,不需要如何签证和通行证。
前言不搭后语:
故乡容不下梦想,于是我长途跋涉,从家乡到他乡。然后辗转反侧20年后,青春就要褪色,却仍不肯放弃看似毫无希望的梦想,我就是忘不掉出发时的初心,那片梦想之地就是我的信仰,这就是我在很多同时期身边人,甚至很多后辈都财富自由,都过上退休生活的年纪,仍在孤军奋战的原因。因为我知道那个世界超越世俗的一切,没有现实的枷锁,是天马行空真正的自由世界,这不是能用财富,地位所能衡量的。它超越所有的世间的奖励。
我不会放弃,今生一定要找到它,也一定会找到它,然后把它描绘出来。
今天这节的内容:
如何快速制作不同振动点在水面形成的“干涉模式”
这一节要实现的效果
.....
▉今天是42岁第034天周三
这是写给houdini的
第060封“情书”
我是geo流程图
我是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:干扰图案 01) 想象在水的表面上,有浮标上下移动,这就产生了波浪。 02)中间互相抵消,叫做破坏性干扰模式! 03)建设性放大,产生波的形状,波浪的起伏幅度取决于两个振子的位置,距离和震荡频率。 我们想计算网格红点的振幅 04)假设它们的频率是相同的 我们需要知道 a) 有多少振荡器 b) 它们的频率 c) 到每个振荡器的距离 05)公式 06)最终强度: 07)我们只要将两个波前强度结合起来 就可以给我们最后的整体力量,这会产生有趣的干扰模式! 接下来 开始正式制作 使用软件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 // //-----------准备工作----------- //-- 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 // a) 转成detail属性,仅有一个值,也就是将之前储存的所有maxd最大值,这是maxd的全局最大值; 3:最后求{每个正玄}并{相加}形成干涉图 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”的效果 8): // 给“最大距离maxd*0.25”的效果 a); 今天就到这儿了,收功 教程翻译自entagma的网络教程 下一节:Quicktip: Signed Distance Outlines 本文图片全部原创,版权归原作者所有