第093封“情书”:三生万物Vellum Cell ReplicationPart3 <Entagma>Houdini 2019

▉  一生二,二生三,三生万物。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】


+6p5iRE_fw658.jpg

█ “无生有,有生于无,自始自终,无始无终。 ”

前言不搭后语

xx。

本节内容
首先添加胶水约束细胞,慢慢撕裂;然后添加额外的躲避行为,最后后期模拟设置,


本节要实现效果
.....






20190408 Vellum Cell Replication TutorialPART7.png

今天是42岁
066周日

93
这是写给Houdini的第093封“情书”


我是vex代码

❖设置glue组中的约束20帧分离❖

//--1 在20帧处打破glue约束

float glue_remove_age=20;

if(@age_f>glue_remove_age){

    //设置的如果是胶水组的prim情况下

    if(i@group_con_dyn_glue_stretch){

        //--2 移除胶水里的约束prim;

        removeprim(0,@primnum,1);

    }

}

❖沿y轴增加最小最大age变量❖

/--3 设置最小最大age:

float glue_remove_age_min=chf("glue_remove_age_min");

float glue_remove_age_max=chf("glue_remove_age_max");

float glue_remove_age=fit01(dyn_glue_ramp,glue_remove_age_min,glue_remove_age_max);

//--4 钳制在80%的细胞分裂前,glue约束完全移除

glue_remove_age =clamp(glue_remove_age,0,@split_age_f*0.8);

❖增加避免行为❖

float search_rad = chf("search_rad");

int max_pnts = ch("max_pnts");

float inner_rad = chf("inner_rad"); //半径范围内

//--1 寻找附近点:

int pc= pcopen(0,"P",@P,search_rad,max_pnts);

//--2 创建循环

int ext_cell_id ;

vector ext_pos;

while(pciterat(pc)){

    pcimport(pc,"cell_id", ext_cell_id );

    ext_pos= pcfilter(pc,"P"); 

    //--3 如果当前处理的点不是原始点;

    if (i@cell_id != ext_cell_id)

    //--4 计算相邻cell的方向.

        vector avoid_dir = @P - ext_pos;

        float avoid_amp = fit(length(avoid_dir),inner_rad,search_rad/2,1,0);

        v@avoid_vec = normalize(avoid_dir)*avoid_amp;

    }

}

❖设置停止分裂❖

float search_rad = chf("search_rad");

int max_pnts = ch("max_pnts"); 

//--1 寻找附近点:

int pc= pcopen(0,"P",@P,search_rad,max_pnts);

//--2 创建循环

int ext_cell_id ;

vector ext_pos;

while(pciterat(pc)){

    pcimport(pc,"cell_id", ext_cell_id );

    ext_pos= pcfilter(pc,"P"); 

    //--3 如果当前处理的点不是原始点;

    if (i@cell_id != ext_cell_id){

    //--4 计算相邻cell的方向.   //--5 与邻居距离

         f@nb_dist = length(@P - ext_pos);    

        //--6 一旦距离低于这个阈值

        i@split_stop = 1;      

    }

}

❖   ❖



首先
制作步骤

 

小节提要

A

01

设置glue胶水约束

B

02

手动glue约束的分离:

1.设定约束在glue组中20帧分离  

2.沿y轴增加最小最大age变量  

3.增加age随机性

C

03

增加避免行为:

1.找到中心点  

2.细胞间矢量

3 把点属性复制到prim  

4.创建细胞间推力

5.转换开关

D

04

设置停止分裂

1 当cell距离太近,没有足够空间之前,停止分裂  

2 视觉化“停止分裂    

E

05

高模映射到低模 

1. foreach循环

2.合并‘高低模”

3.高模映射至低模

4.清理所有cloth属性

5.低模传递给高模属性

F

06

创建细胞核  

接下来
正式制作
            使用软件:houdini17.5


0 1 设置glue约束


○ 节点 ○




○ 具体操作 ○

进入cell_setup里设置约束,比dopnet里设置更安全;

1)vellumglue:这个只是vellum约束,而没有初始化。

    a)“约束接口”连接“merge_CON输出”

    b)“几何接口”连接‘merge_GEO输出’

2)null

    a)连接“vellumglue”的“约束输出”


image.png

❖ 小目标 ❖

设置glue约束

stretch选项

    a)自定义“胶水组”输出名称:勾选 Output Group=con_dyn_glue_stretch(约束动力学胶水伸展)

    b)让连接更加坚固:stiffness=3000;

    c)阻尼高些:Damping Ratio=0.1;

Breaking选项 

    a)设置断开的阀值Threshold=0.005

测试glue

3)blast:提取出glue约束 

image.png

Glue Search选项

    a)降低搜索最大值Max Search Dist=0.06

image.png

(没有连接更远的点)

❖ 小问题 ❖

现在丢失了很多点属性

❖ 解决方案 ❖

1)拷贝前面的groupcopy_pnts这三个节点

image.png

2)连接vellumglue的约束输出

3)groupcopy和attribcopy点“接口2”连接merge_GEO

image.png

image.png

回到AutoDopNet运行模拟

image.png

❖ 小目标 ❖

a)手动控制“从底部沿特定轴”慢慢上移进行约束的分离

b)这样漂移的细胞可以产生旋转。


0 2 手动glue约束的分离 



○ 具体操作 ○

1.glue组中设置约束在20帧分离

○取消“勾选Breaking”约束阈值;

B02)sopsolver_CON约束解算设置内部

○output1之前加入attribwrangle:命名_remove_glue_con

    a)Run over选择primitives。   

//--1 在20帧处打破glue约束

float glue_remove_age=20;

if(@age_f>glue_remove_age){

    //设置的如果是胶水组的prim情况下

    if(i@group_con_dyn_glue_stretch){

        //--2 移除胶水里的约束prim;

        removeprim(0,@primnum,1);

    }

}

2 沿y轴增加最小最大age变量

❖ 小目标1❖ 

沿着细胞裂底部到顶部增加“最小&最大age”变量 

  ○attribwrangle_remove_glue_con:

     a)...min=20; b)...max=80;

//--3 设置最小最大age:

float glue_remove_age_min=chf("glue_remove_age_min");

float glue_remove_age_max=chf("glue_remove_age_max");

❖ 小目标❖ 

增加特定轴

?解决方案?

prim属性:前面建立cell时的bbox边界框属性

image.png

  

? 操作 ?

  ○attribvop:命名glue_ramp:

    a)bind:name=bbox;Type=vector。

    b)vectortofloat:输出Y轴。

    c)bind export:name=dyn_glue_ramp。

float glue_remove_age=fit01(dyn_glue_ramp,glue_remove_age_min,glue_remove_age_max);

//--4 钳制在80%的细胞分裂前,glue约束完全移除

glue_remove_age =clamp(glue_remove_age,0,@split_age_f*0.8);



3 增加随机性

❖ 小目标❖ 

对每个细胞随机化

❖解决方案❖

    ○attribvop_glue_ramp:运行在prim上

    a)bind:  name=cell_id; (导入cell_id) Type=整数

    b)random;输出

    c)mix:1)input1=y轴;2)input2=z轴;3)bias=随机输出 

    作为特定的随机

    d)complement 求出轴,创造出两种方式;

    e)twoway

    f)compare:Test=Less Than;Compare to Float=0.5

vop流程图

image.png

随机化相当多的方向

image.png


0 3 增加避免行为 



○ 节点 ○



❖ 小目标 ❖

    a)运行一段时间,非常拥挤之后,会给vellum带来很多问题,所以创造一种力,把细胞彼此分开。临近cell上寻找方向,在每个细胞上形成均匀的推力。

    b)如果临近cell太近,太拥挤,应该停止分裂.

❖  具体操作 ❖ 


AutoDopNetwork层级


    1)创建一个sopsolver:命名sopsolver_avoidance

        a)连接给popdrag:


sopsolver_avoidance层级

❖ 小目标 ❖

1)创建一个简单的提取-cell的中心速率信息

2)创建方向

?解决方案?

a.找到中心点

    ○extract centroid节点:

(另一种方法○ pack节点+ add节点=中心点

image.png

? 阶段目标 ?

有了中心→就能找到临近cell→根据P→分析方向

→创造假的“矢量+振幅”分开它们。

振幅取决于细胞之间间距,距离越远,推力越弱。

b.细胞间矢量

    2) attribwrangle:命名avoid_vec

        a)  search_rad = 2;

        b)  max_pnts= 5;

float search_rad = chf("search_rad");

int max_pnts = ch("max_pnts");

float inner_rad = chf("inner_rad"); //半径范围内

//--1 寻找附近点:

int pc= pcopen(0,"P",@P,search_rad,max_pnts);

//--2 创建循环

int ext_cell_id ;

vector ext_pos;

while(pciterat(pc)){

    pcimport(pc,"cell_id", ext_cell_id );

    ext_pos= pcfilter(pc,"P"); 

    //--3 如果当前处理的点不是原始点;

    if (i@cell_id != ext_cell_id)

    //--4 计算相邻cell的方向.

        vector avoid_dir = @P - ext_pos;

        float avoid_amp = fit(length(avoid_dir),inner_rad,search_rad/2,1,0);

        v@avoid_vec = normalize(avoid_dir)*avoid_amp;

    }

}

image.png

c.把点属性复制到prim

    3)attribcopy:命名“copy_from_centroid”

image.png

image.png

d.创建细胞间推力

      4)attribwrangle:命名“_avoid_force”

↑v@force += v@avoid_vec*chf("avoid_force_strength") 

e.转换开关

    5)switch:命名_use_avoid_force;

selcet_Input:1

image.png

    6) output:


0 4 设置停止分裂


○ dopnet内部节点 ○


❖  小目标 ❖

当cell距离太近,没有足够空间之前,停止分裂

? 解决方案 ?

   7) attribwrangle:<复制3>命名split_stop

a)不需要inner_rad ;b)Search Rad=0.79

float search_rad = chf("search_rad");

int max_pnts = ch("max_pnts"); 

//--1 寻找附近点:

int pc= pcopen(0,"P",@P,search_rad,max_pnts);

//--2 创建循环

int ext_cell_id ;

vector ext_pos;

while(pciterat(pc)){

    pcimport(pc,"cell_id", ext_cell_id );

    ext_pos= pcfilter(pc,"P"); 

    //--3 如果当前处理的点不是原始点;

    if (i@cell_id != ext_cell_id){

    //--4 计算相邻cell的方向.   //--5 与邻居距离

         f@nb_dist = length(@P - ext_pos);    

        //--6 一旦距离低于这个阈值

        i@split_stop = 1;      

    }

}

❖  小目标 ❖

视觉化“停止分裂”

 3)attribcopy_copy_from_centroid:

    a)增加aplit_stop属性

image.png

 8) visualize

image.png

image.png

a)红色禁止分裂,当达到一定的距离为止。

现在只剩下“分割停止属性”放入解算器


sopsolver_GEO


image.png

○ attribwrangle_split_age_group

//--检查年龄到达split_age//--到达不停止分裂时间

else{

if (@age_f>=@split_age_f &&  i@split_stop !=1)@group_split =1;

}




0 5 高模映射到低模


○ 节点 ○




○ 具体操作 ○


import_cells层级

❖  小目标 ❖

每一个循环再做一次.

? 解决方案 ?

   

1.foreach循环

 ○ For-each Named Primitive:

    a)Piece Attribute:cell_id 

cell_setup层级高模“OUT_cell_hires_geo”合并进来


2.合并‘高低模”

 ○ object merge:命名“_hires_geo”高模

image.png

     ○ object merge:命名“_init_geo”低模

image.png

3.高模映射至低模

   ○ clothcapture:Radius=0.1;

image.png

 ○ clothdeform

image.png

4.清理所有cloth属性

        ○ clothdeform:

image.png

5.低模传递给高模属性

     ○ attribtranfer。

image.png

       ○ null:命名OUT_cell_surface.        

image.png


0 6 创建细胞核


○ 节点 ○



? 解决方案 ?

使用VDB

    ○ null:连接vellumpostprocess输出

❖小目标❖

分裂的细胞共享一个细胞核,然后缓慢的分裂

    ○ For-each Named Primitive:

        a)对cell_id进行循环。

image.png

        b)循环中

1)vdbfrompolygon :○ VoxelSize=0.02

2)vdbreshapesdf1 :扩展一下

image.png

3)vdbsmoothsdf :平滑

image.png

4)vdbreshapesdf2 : 收缩

image.png

image.png

5)vdbsmoothsdf 2 : 平滑

6)convert VDB:convert to=polygons

    ○ null2:OUT_cell_core_surface

image.png


07 细胞核膜建立单独容器


○ 节点 ○



○ 具体操作 ○

1)复制OUT_cell_core_surface


obj层级

1)为OUT_cell_core_surface创建一个单独容器

○ geo命名“cell_cores”


cell_cores层级

1)object_merge:引进OUT_cell_core_surface

image.png

2)复制cell_cores命名“cell_surface”


cell_surface层级

1)object_merge:引进OUT_cell_surface

image.png

image.png

image.png


封面图片7.jpg
教程翻译自entagma的网络教程
下一节: 
电子邮箱:oneinchtime@126.com

公众号:微信图片_20190607085947.jpg微信号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值