前言:
目前你们对“粒子群算法数组”大概比较珍视,小伙伴们都想要知道一些“粒子群算法数组”的相关内容。那么小编同时在网络上搜集了一些关于“粒子群算法数组””的相关知识,希望大家能喜欢,各位老铁们快快来了解一下吧!▉ 再糟的人生也能触底反弹,即使你是个废柴。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】<Entagma>Houdini 2017
█ 如果说生活教会了我什么,那就是去享受失败
任何大师都是从菜鸟开始的,任何高手也是从新手开始,其中很多能取得出众的成就的人开始并不出色,甚至资质平平,因为天赋是一回事,后天努力更是才是逆袭的关键。
以前荒废过,不代表以后就废了,知耻而后勇,去做,去犯错,每犯过一个错误,成功的概率就会更大一点。
草根终有逆袭日,人生再无回头时。
今天这一节内容:
点分散在允许结构空间中生长成一堆废柴。
这一节要实现的效果
.....
▉今天是42岁第022天周五
这是写给houdini的
第048封“情书”
我是geo流程图
我是solver流程图
我是vex代码创建一个空的数组
i[]@associates = array();
储存所有信息到nodes组
pointwrangle1命名associates
//-- 1 首先创建搜索半径
float infrad = ch("infrad");
//-- 2 然后是搜索nodes点的临近点
int nearpnt = nearpoint(0,"nodes", @P, infrad);
//-- 3 新的局部变量组 接受从ptnum进入数组,
int valarr[] = array(@ptnum);
//-- 4 设置点的属性,“associates”=这是数组属性的名字,设置到这个属性里;nearpnt=搜索的关联属性的临近点;valarr要写到属性里的值;
//append这个很重要,因为越来越多的吸引点加入进来,不会覆盖前一次的搜索结果,这个数值会越变越长,最终将包含所有吸引点,
setpointattrib(0,"associates",nearpnt,valarr,"append");
pointwrangle1命名expand_tree
//-- 1 我们用它作为判断放置新基础点的距离。
float rad = ch("rad");
//-- 2现在要写入早前收集的信息,从属性中读取信息放入一个局部变量,以便协同工作。
int myassociates[] = i[]@associates;
//-- 3 接下来收集所有associate的信息,如果associate在场,快速
if (len(associated)>0) {
//-- 3-1 初始化临近点矢量和
vector sun= {0,0,0};
//-- 3-2 遍历associates数组里的所有点
foreach(int node; myassociates){
vector nodepos = point(0,”P”,node);
vector dir = normalize(nodepos - @P);
//-- 3-2 新的方向等于之前所有临近点方向之和
sum += dir;
}
sum = normalize(sum);
//-- nnode=新增的基础点; @P+..=位置+方向*粒子直径
//我读取的位置,正好是一个直径与old基础节点,在发现的方向上。
int nnode = addpoint(0,@P+sum*rad);
//-- 接下来就是把新的节点移入nodes组;
setpointgroup(0, “nodes”,nnode,1,”set”);
//-- 把nodes组的颜色属性也赋给新基础点
setpointattrib(0, “Cd”,nnode,{1,0,0},”set”);
//-- 增加polyline和顶点
int nprim = addprim(0, “polyline”);
addvertex(0,nprim,@ptnum);
addvertex(0,nprim,@nnode);
}
pointwrangle1命名remove_attractors
//--设置半径变量killrad
float killrad = ch("killrad");
//-- killerrad半径范围内的所有吸引点====
int nearpnts[] = nearpoints(0,"attractors",@P, killrad);
foreach(int pnt; nearpnts){
removepoint(0,pnt);
}
本节需要注意的知识点:
1
创建更明显的不均匀分布点
isooffset体积化模型:
1)第1部分://volumevop里noise,fit,ramp//scatter撒多点// 形成比较密集的点。
2)第2部分:// scatter撒的少点
3) 合并。
2
创建一个空的数组属性
1)i[]@associates = array();
3
“吸引点组”里临近粒子设置到数组中
针对“吸引点组”里的粒子。associates 只 Group: attractors.
//-- 1 首先创建搜索半径 float infrad = ch("infrad");
//-- 2 然后是搜索nodes点的临近点 int nearpnt = nearpoint(0,"nodes", @P, infrad);
//-- 3 新的局部变量组 接受从ptnum进入数组,这样创建只有一个数值的数组,这个数值是当前搜索的点 int valarr[] = array(@ptnum);
//-- 4 设置点的属性,“associates”=这是我数组属性的名字,设置到这个属性里;nearpnt=我搜索的临近点的关联属性;valarr要写到属性里的值;setpointattrib(0,"associates",nearpnt,valarr,"append");
4
实现枝条生长效果
//-- 1 判断放新基础点的距离float rad = ch("rad");
//-- 2 早前收集的信息从数组属性中读取出来放入一个局部变量 int myassociates[] = i[]@associates;
//-- 3 收集所有associate的信息
if (len(associated)>0) {
//-- 3-1 初始化临近点矢量和 vector sum= {0,0,0};
//-- 3-2 遍历associates数组里的所有点
foreach(int node; myassociates){
vector nodepos = point(0,”P”,node);//增加P
vector dir = normalize(nodepos - @P);//标准化方向矢量
//-- 3-2 新的方向等于之前所有临近点方向之和
sum += dir;
sum = normalize(sum);//标准化
//增加新的基础点
int nnode = addpoint(0,@P+sum*rad);
//-- 接下来就是把新的节点移入nodes组;
setpointgroup(0, “nodes”,nnode,1,”set”);
//-- 把nodes组的颜色属性也赋给新基础点
setpointattrib(0, “Cd”,nnode,{1,0,0},”set”);
//-- 增加polyline和顶点
int nprim = addprim(0, “polyline”);
addvertex(0,nprim,@ptnum);
addvertex(0,nprim,@nnode);
5
移出基础点半径范围内的吸引点
//--设置半径变量killrad :float killrad = ch("killrad");
//-- killerrad半径范围内的所有吸引点====
int nearpnts[] = nearpoints(0,"attractors",@P, killrad);
foreach(int pnt; nearpnts){ removepoint(0,pnt);
}
接下来
理论部分
问题1:空间变换算法
01)论文: 空间定域算法在树建模中的应用:
之前的两种 a)recursive递归函数;b)迭代函数系统;2007年后出现一种新的方法:关键点再与争夺空间,有了这种算法,就有可能对分支进行建模,
02)算法的图形化概述:吸引点分散在允许结构生长空间中.
1)基础节点在它周围进行搜索临近点,
2)临近的每一个吸引点被发现了,每个基础节点有不止一个相关的吸引点,每个吸引点只有一个最接近的基础节点,现在有方向了,
3)
A)只有一个吸引点,一个方向,两者之间形成了矢量
B)有3个吸引点,取方向,normalize向量,然后相加,再次normalize,得到方向的的平均值,
4)现在从结构中生成基础节点,沿着计算的新的方向,生长出一个基础节点直径的距离
5)最后移出最接近的吸引点,使用一个参数kill radius作为判断半径,
接下来,2极有可能在下一个基础节点的killradius半径范围内,然后被移除,
接下来
开始正式制作
使用软件houdini16.5
问题2:如何创建更明显的分布不均匀点
1)file->transform
// 不要把点直接撒到模型上,首先转成volume,我们需要体积的效果。
2)isooffset1 // <>
为了便于观察体积效果,加节点
3)volumevisualization // Density Scale=8
4) scatter1 //
a) Force Total Count:10万;取消Relax Iterations
5)volumevop //
a) 加入噪音控制:
b) 调解曲线:
6)group1 // ”吸引点attractors“的组
a) Group Name : attractors.
b) Group Type : Points.
7)color1 // 蓝色
在合并一个稀疏的分散点:
8)scatter2 // 连isooffset1 // 撒1万个点
9)merge //
10)add // 增加三个点,移动一下位置
11)group2 //
a) Group Name : nodes.
12)color2 // 红色
13)merge2 // 合并两组粒子
14)solver1 //
14-1) pointwrangle重命名init_associates(初始化联系) //创建一个空的数组属性 ,因为搜索离基础点最近的所有的吸引点。然后 搜索信息要储存在基础点。我们把搜索的结果储存在数组里,
//-- 创建一个空的数组,i=整数,[]=不是标准属性是数组属性,初始化数组返回空值
//-- 每次运行,初始化,array函数返回空的数组,这点非常重要,后面每一步有了新的数组可以观察到 ,
i[]@associates = array();
14-2) pointwrangle重命名 associates(初始化联系) 只针对“吸引点组”里的粒子 Group: attractors. 这里只搜索离基础点最近的吸引点粒子。
// Infrad = 0.03
//-- 1 首先创建搜索半径
float infrad = ch("infrad");
//-- 2 然后是搜索nodes点的临近点
int nearpnt = nearpoint(0,"nodes", @P, infrad);
//-- 3 新的局部变量组 接受从ptnum进入数组,我们不能让整数值进入数组属性,必须储存数组进入数组
//这样创建了只有一个数值的数组,这个数值是当前搜索的点
int valarr[] = array(@ptnum);
//-- 4 设置点的属性,“associates”=这是我数组属性的名字,设置到这个属性里;nearpnt=我搜索的临近点的关联属性;valarr要写到属性里的值;
//append这个很重要,因为越来越多的吸引点加入进来,不会覆盖前一次的搜索结果,这个数值会越变越长,最终将包含所有吸引点,
setpointattrib(0,"associates",nearpnt,valarr,"append");
14-3) pointwrangle重命名expand_tree(枝条生长) // Rad = 0.002 粒子的直径
//-- 1 我们用它作为判断放新基础点的距离。
float rad = ch("rad");
//-- 2现在要写入早前收集的信息,从属性中读取信息放入一个局部变量,以便协同工作。
int myassociates[] = i[]@associates;
//-- 3 接下来收集所有associate的信息,如果associate在场,快速
if (len(associated)>0) {
//-- 3-1 初始化临近点矢量和
vector sun= {0,0,0};
//-- 3-2 遍历associates数组里的所有点
foreach(int node; myassociates){
vector nodepos = point(0,”P”,node);
vector dir = normalize(nodepos - @P);
//-- 3-2 新的方向等于之前所有临近点方向之和
sum += dir;
}
sum = normalize(sum);
//-- nnode=新增的基础点; @P+..=位置+方向*粒子直径
//我读取的位置,正好是一个直径与old基础节点,在发现的方向上。
int nnode = addpoint(0,@P+sum*rad);
//-- 接下来就是把新的节点移入nodes组;
setpointgroup(0, “nodes”,nnode,1,”set”);
//-- 把nodes组的颜色属性也赋给新基础点
setpointattrib(0, “Cd”,nnode,{1,0,0},”set”);
//-- 增加polyline和顶点
int nprim = addprim(0, “polyline”);
addvertex(0,nprim,@ptnum);
addvertex(0,nprim,@nnode);
}
14-4) pointwrangle重命名remove_attractor(移出指定半径内的吸引点) // Killrad= 0.01
//--设置半径变量killrad
float killrad = ch("killrad");
//-- killerrad半径范围内的所有吸引点====
int nearpnts[] = nearpoints(0,"attractors",@P, killrad);
foreach(int pnt; nearpnts){
removepoint(0,pnt);
}
今天就到这儿了,收功
教程翻译自entagma的网络教程
下一节:20170911 Loops & VEX- Artistic Quadtrees
本文图片全部原创,版权归原作者所有
标签: #粒子群算法数组