第097封“情书”:浮生碌碌PDG For Design Work Pt. 4 - Distributed Grains Using PDG<Entagma>Houdini 2019
▉ 跟着内心走,走出平庸。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█ “ 人间没有白走的路,每一步都算数。”
前言不搭后语
最近马上要到100篇,接下来要进入一个新的阶段,所以100篇以后可能不会日更了。
诸位,抱歉了!
一种模仿泡沫生长的效果,基本的grain模拟方法,使用topnet和PDG运行在农场上。
我是流程图
❖obj❖
❖coliider碰撞体流程图❖
❖sim模拟流程图❖
我是popnet流程图
❖第一个粒子发射器❖
❖边缘粒子发射器grain颗粒模拟❖
TOPnet流程图
❖distribute_popobject分配节点流程图❖
❖保留碰撞粒子❖
//--1 如果粒子碰撞次数小于1,删除粒子。
if(@hitnum<1){
removepoint(0,@ptnum);
}
//--2 再设置一下粒子大小。
[email protected] = 0.005;
❖提取边缘粒子❖
//--1 临近点
int npt[] = nearpoints(0,[email protected],0.05,96);
//--2 点数
int np = len(npt);
//--3 如果点数超过某一阈值,删除
if(np>72)
removepoint(0,@ptnum);
❖映射随机粒子尺寸❖
[email protected] = 0.01*fit01(rand(@id),0.5,1.0);
❖popwrangle粒子尺寸❖
//--1 粒子年龄0~1
float u = [email protected]/[email protected];
//--2 映射
float s = fit(u,0.0,0.1,0.0,1.0);
//--3 chramp更精确的驱动 ,再增加点随机性
[email protected] = chramp("ramp_scale",s)*chf("Amp")*fit01(rand(@id),0.25,1.0);
首先
制作步骤
小节提要
混合了液体和颗粒的混合物,使用PDG可以有效地在农场中分布式计算。
01
粒子动力学设置
02
设置边缘&中心粒子
03
边缘颗粒发射粒子的grain模拟
04
粒子模拟在农场分布式计算
正式制作
使用软件:houdini17.5
○ 节点 ○
???? A 创建碰撞体 ????
1) 圆环:vdbanalysis1:行=24;列=48
2) 输出:null命名 OUT_collider
3) 裁切:clip1
???? B 创建模拟设置 ????
❖ 小目标1 ❖
发射器设置
1) 小球:sphere1:scale=0.1;
2) 移动:transform1 :旋转Y $FF*0.75
3) 输出:null命名OUT_Surface
4) 粒子:popnet
04-1)重力gravity1:
04-2)合并merge1:
04-3)碰撞机staticobject1:
·合并碰撞物:
·增加碰撞精度:
-------❖ 希望粒子像液体一样 ❖-------
04-4)加流体popfluid1:更小分离
04-5)解算器popsolver:更多迭代
--------❖ 发射器 ❖--------
04-6)发射源 source_first_input:
04)popnet
○ sim内节点 ○
❖ 小目标1 ❖
???? a 解决方案 ????
只考虑碰撞几何体的粒子,增加一个碰撞属性 Hit
04-5)结算器 popsolver:增加Hit属性,取消其它属性。
这个属性:反馈粒子撞击了多少次碰撞体。
6)只保留碰撞的粒子 pointwrangle1:
//--1 如果粒子碰撞次数小于1,删除粒子。
if(@hitnum<1){
removepoint(0,@ptnum);
}
//--2 再设置一下粒子大小。
[email protected] = 0.005;
多余的属性
???? 删除 ????
7)删除多余属性 attribdelete1:
❖ 小目标2❖
粒子液体的外部区域
(也就是释放出的泡沫状颗粒出现在液体的边缘)
???? 解决方案 ????
8) 临近点:pointwrangle2:
//--------删除粒子流体中心位置的粒子--------
//--1 临近点
int npt[] = nearpoints(0,[email protected],0.05,96);
//--2 点数
int np = len(npt);
//--3 如果点数超过某一阈值,删除
if(np>72)
removepoint(0,@ptnum);
❖没有反应❖
???? 解决方案 ????
04-3)staticobject1:取掉摩擦力
04-7)popobject:减小反弹
解决
❖ 小目标3 ❖
???? 解决方案 ????
09)pointwrangle:
[email protected] = 0.01*fit01(rand(@id),0.5,1.0);
10)sprite: 改变粒子贴图
连接上边缘粒子
○ 节点 ○
12)popnet1:接口1接“边缘粒子”接口2连“中部粒子”
12-1)设置粒子源 source_first_input
初始速度=0,产生互相推挤的效果。
12-2)粒子间互相推动popgrains1:(这里会产生大量粒子,它们互相作用)
a)减少摩擦:
b)设置粒子速度混合一些参数,产生粘的感觉,互相彼此推开。
12-3)粒子阻力 popdrag1:阻力=0.25这是作者不断测试的结果。
12-4)popwrangle1:
//--1 粒子年龄0~1
float u = [email protected]/[email protected];
//--2 映射
float s = fit(u,0.0,0.1,0.0,1.0);
//--3 chramp更精确的驱动 ,再增加点随机性
[email protected] = chramp("ramp_scale",s)*chf("Amp")*fit01(rand(@id),0.25,1.0);
12-5)merge1:
12-6)gravity1: -0.1
⚪设置与总碰撞物的碰撞⚪
12-7)staticobject1:
⚪设置与中心粒子的碰撞⚪
12-8)staticobject2: SOP路径:`opinputpath("..",1)`
○ 节点 ○
12-2)popgrains1:迭代值提的非常高
12)popnet1
a1)选择工具架 grain/ Slice工具
a2)进入popnet1
a3)视图中选择模拟粒子。
a4)回车。产生slice1
a5)再次重复一遍,再建立一个slice2
a6)转动slice1:
3
○ ○
b1)选择popnet1:点击工具栏“Disribute Particle Fluid
b2)选择模拟粒子:
b3)回车,弹出窗口问你“需要哪种分配方式”选择slice切片方式。
b4)这就在out渲染层级中建立了HQueue Simulation分布式节点
1)
2)这里不使用它,二用PDG来做。所以让它失效。
b5)进入distribute_popobject层级
1)slicegeometry 切片的几何体
2)save_slice :保存的单独切片
3)loadslices :加载slice文件,负责合并重组模拟的但各部分
4)建立null命名“OUT_Distr_Slice”——这将是这是topnet实际的引用。
C)进入topnet
01)ropgeometry1 :
a)这里SOP Path引用路径:就是上面的null。
b)Output输出文件:关联复制Loadslice的路径
c)ROP Fetch面板/ 勾选Distributed Sim分布式模拟增加切片计数=4,因为我们有四片切片!
2)最后建立HQueue Scheduler节点 :
1)工作目录
2)HQ服务器地址:
3)勾选“over..”覆盖本地共享路径
4)点击Load from HQueue:检查分区路径
5)最后是houdini的本地安装目录。
○ 选择 ropgeometry1 shift+V。
目前作者增加了“grain density”“粒子数”“grain的迭代”
○ 最后结果在distribute_popobject节点内:loadslices上看。连接sprite粒子贴图查看模拟的粒子。
公众号:微信号