龙空技术网

第048封“情书”:草根VEX in Houdini- Space Colonization

致houdini的情书 64

前言:

目前你们对“粒子群算法数组”大概比较珍视,小伙伴们都想要知道一些“粒子群算法数组”的相关内容。那么小编同时在网络上搜集了一些关于“粒子群算法数组””的相关知识,希望大家能喜欢,各位老铁们快快来了解一下吧!

▉ 再糟的人生也能触底反弹,即使你是个废柴。— 每天翻译一篇教程,这就是我写给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

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

标签: #粒子群算法数组