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

本文主要是介绍第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微信号

这篇关于第093封“情书”:三生万物Vellum Cell ReplicationPart3 <Entagma>Houdini 2019的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/531719

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

cell phone teardown 手机拆卸

tweezer 镊子 screwdriver 螺丝刀 opening tool 开口工具 repair 修理 battery 电池 rear panel 后盖 front and rear cameras 前后摄像头 volume button board 音量键线路板 headphone jack 耳机孔 a cracked screen 破裂屏 otherwise non-functiona

2019学习计划

工作三年了,第一年感觉是荒废的,第二年开始学习python,第三年开始自动化 感觉自己会的东西比较少,而且不够深入,流于表面 现制定一下今年大概的学习计划 需持续巩固加强:python、ui自动化、接口自动化、sql等 代码量需提升,敲的不够(重点) 学习: 1.移动端测试,appium等 2.前端知识系统整理学习  3.性能测试 4.docker入门,环境搭建 5.shell

简单梳理UE4的Houdini官方插件代码

前言 Houdini官方插件名字叫 “Houdini Engine”,它搭建了Houdini数据与UE4数据间的桥梁。我接触这个插件已经有段时间了,我想是时候梳理一下插件的结构了。(当前我用的UE4版本是4.24.2,Houdini版本18.0.348) 需要说明的是,这篇博客主要是从代码出发的。我准备先分析插件整体的代码结构,再逐个翻阅每个文件试图搞明白他角色。但如果不准备研究代码结构和实现

简单盘点编程在Houdini游戏开发中的用武之地

概括 Houdini作为一个程序化为主要思路的工具,不出意外地在很多地方支持用代码来描述自己想要的行为。这篇博客简单盘点了我目前了解到的,编程在Houdini开发(特指游戏开发)中的用武之地。 概括讲,可以分为三部分: Houdini编辑器内。一般只服务于Houdini自身。Houdini Engine游戏插件。例如它为UE4、Unity都提供了插件,其目的是方便将Houdini中的数据和游戏

试用 Houdini Engine Python API

介绍 hapi 这个python包 是HoudiniEngine的一层python封装。 使用python的优势是灵活性,因为C代码总需要编译,使得迭代较慢。 Tips: hapi中的内容总可以查阅HoudiniEngine的文档,因为概念和函数是相同的。 使用环境 1. Houdini编辑器内:Python Shell 在其中可以 import hapi: 2. Houd

翻译Houdini官方对UE4新版插件的介绍:Houdini Engine for Unreal - V2

原视频:Houdini For Unreal - YouTube 目录 介绍0. 总览1. 简介HoudiniEngine2. UE4的HoudiniEngine - 第二版为什么要做“第二版” ?What's new? - 核心What's new? - 输出(1)What's new? - 输出(2)What's new? - 输入What's new? - 参数What's new?

Houdini的参数预设(Preset)功能

功能 Houdini中,可以将节点的参数值存为一种预设: 操作 点击参数面板的小齿轮按钮,选择Save Preset即可将当前的参数保存为一种预设 接下来的窗口可指定预设的名字。而Save Preset To的选项可以指定当前预设存放的位置,可以选择仅让其在当前HIP目录中有用。 Tip: 根据 官方文档:Save Preset window 所描述,Save Preset To

小工具:输出Houdini里节点间参数的差别

需求 节点的参数影响了节点的行为。因此对于节点使用者来说,比较节点间参数的差异就可以明白其行为的差异了。 然而有些节点的参数数量实在太多,比较其参数间的差异会比较麻烦,在没有工具的情况下只能来回在节点间跳转才能比较出参数的不同。 我想,其实可以使用Houdini的Python模块写代码来自动比较并输出不同,这并不麻烦。最后如果能输出更易于阅读的格式(比如csv表格,或Markdown表格语法

最简单的使用JDBC[连接数据库] mysql 2019年3月18日

最极简版本的, 我们这里以mysql为例: 首先要创建maven工程, 需要引入jar包:,这里需要注意, 如果你安装的是mysql最新版本8以上的, 下面有些地方需要更改,具体就是mysql连接的url, 和5版本的不一样,具体解决请自行百度哈.这里只演示mysql5版本的? 依赖: <dependency>   <groupId>mysql</groupId>   <artifactId