第079封“情书”:“I服了You”Cloth Solver From Scratch<Entagma>Houdini 2018
▉ 我从来不会对任何人任何事投降,直到遇见你。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█城头变幻大王旗:曾经面对刁钻的甲方,很多人都乖乖投降,我却仍负隅顽抗,但最后还是举了白旗,一遍遍的改,改到面目全非。
前言不搭后语
没什么会永垂不朽。
别灰心,人生就是这样,起起落落落落落落落落。
搭建一个布料模拟系统
我是geo流程图
我是solver流程图
重力
// --创建一个重力属性
v@verlet_force = {0,-9.81,0};
.verlet集成
//-- 创建变量储存当前位置(稍后需要更新旧的位置)
vector tmp = @P;
//-- 把旧位置赋给局部变量
vector oldx = v@oldx;
vector force = v@verlet_force;
//-- 套用公式,Timelnc=全局变量
@P += (@P - oldx)+force*@TimeInc*@TimeInc;
//-- 更新
v@oldx = tmp;
遍历所有粒子
//-- 1 读入约束条件,所有当前进程相关的prim
int myconstraints[] = pointprims(1,@ptnum);
//-- 2 初始化位移,重量
vector displacement = {0,0,0};
float weight = 0.0;
//-- 3 遍历所有约束,这些是当前进程约束,然后必须传递其他约束数组
foreach(int constraint; myconstraints){
//-- a 现在处理所有prim,计算所有点的偏移。从prim中个读出这些点
int constraintpnts[] = primpoints(1,constraint);
//-- b 这些点的位置,约束第一个点posa 第二个点posb
vector posa = point(0,“P”,constraintpnts[0]);
vector posb = point(0,“P”,constraintpnts[1]);
vector delta = posa - posb;
float deltalength = length(delta);
//-- c 读出净值长度值
float restlength = prim(1,“restlength”,constraint);
//-- d 计算两者之间的差别
float error = (restlength - deltalength)0.5;
float dir =0;
//-- 检查方向
if(constraintpnts[0]== @ptnum){
dir = 1.0;
}
else{dir = -1.0;}
displacement += normalize(delta)errordir;
weight += 1.0;
}
@P += displacement/weight;
—固定点–
if (@ptnum == 0){@P = {0,1,0};}
else if(@ptnum ==380 && @Frame >40){ @P={0,1,1};}
else if(@ptnum 399 && @Frame >120){ @P={1,1,1};}
else if(@ptnum 19 && @Frame >90){ @P={1,1,0};}
小节
本节将学习:
01)理论Verlet集成。
05)约束理论。
Verlet集成
○ 参考文献○
2003年的一篇文章,它的约束是使用迭代的方式来实现的,付出的代价就是反复迭代,接下来从这个角度理解一些理论。
○ 理论 ○
-----使用粒子对一块布进行建模----
a)首先在布的每个顶点找到一个粒子。
b)然后物理定律模拟这些粒子,
c)接着使用约束线约束这些粒子,并保持一定距离。
A)模拟粒子通常使用“Euler integration 欧拉集成算法”
首先记住牛顿第一定律“力F=质量m加速度a”。
本案例
a)假设mass=1,此公式简化为“F=a”。
b)为了让粒子运动,需要整合force to velocity和velocity to position。而这需要由公式V来完成:
第一个公式“Euler integration” |
(一):V1(新速度)=V(旧速度)+a(加速度)δt (二):X1(新位置) =X(旧位置)+V1(新速度)δt |
推导:X1 =X+(V+aδt)δt = X+V δt +aδt2 |
-----这是一个二重积分,在这个坐标系中,它会给我们一个新的粒子位置,这是标准方法。
-----但对我们要达到的目的有缺陷,缺陷就是它使用了V速度矢量。
-----要实现我们需要的约束,粒子要移到正确的位置来满足约束条件,如果用所有积分来做这个,速度就失去了同步,必须不断地更新速度,这非常麻烦, 也许有更好的整合方案,既可以使用隐含的速度,
B)“Verlet integration集成算法”
1)不同之处:垂直整合了隐含的速度,与使用速度矢量不同
2)此算法将储存粒子上一帧的位置,然后从近似速度的信息,来得到有效的集成:
第二个公式“Verlet integration” |
(一)X1(新位置)= 2X - X +aδt2; (二)X = X;-------------更新“前位置” |
这里没有V,只有位置信息,这意味着,一旦移动了粒子,速度将被正确的计算出来, |
3)可以使用verlet公式推导出euler公式:
a)X = X +Vδt 推导出:V = (X - X)/ δt;
b) X1 = X +(X- X) + aδt2 = 2X-X + aδt2
正式制作
○ 节点 ○
○ 具体操作 ○
01)grid:尺寸11;分辨率2020
重要伏笔)对以后约束很重要
02)divide:网格三角形化。
小目标)模拟之前配置一下系统
03)pointwrangle命名configure
执行)设置旧的位置X
//-- 创建新的向量属性 初始化到当前位置
v@oldx = @P;
○ dopnet内部节点 ○
○ 具体操作 ○
04)solver。
小问题)因为第一帧还没有前一帧,首先处理prev_Frame
解决方案)增加一个开关
执行)
04-1)switch
a) 连Prev_Frame和Input_1
b) 表达式:$F1
(第一帧从Input_1输入,之后从Prev_Frame输入)
小目标)创建重力
04-2)pointwrangle命名forces
执行)
v@verlet_force = {0,-9.81,0};
小目标)实现粒子系统
04-3) pointwrangle命名verlet_intergration
执行)
//-- 创建变量储存当前位置(稍后需要更新旧的位置)
vector tmp = @P;
//-- 把旧位置赋给局部变量
vector oldx = v@oldx;
vector force = v@verlet_force;
–播放,grid下坠–
○ 节点 ○
○ 具体操作 ○
04-3) pointwrangle命名verlet_intergration
//-- 套用公式,Timelnc=全局变量
@P += (@P - oldx)+ force*@TimeInc*@TimeInc;
//-- 更新
v@oldx = tmp;
—粒子系统下落的grid的粒子形成的—
小目标)设置约束
解决方案)
使用prim创建一种简单的定义约束方法:
创建连接两个粒子(受约束)的一条线。
执行)
05)convertline:
a)创建restlength用于“约束迭代步幅”
b)连接solver的接口2;
约束理论分析)
a)粒子受它们之间连线的约束;
b)这些线有一个restlength静止长度;
c)当force拉粒子时,会扭曲grid,约束线被拉长,
d)这时solver这些约束,因为移动一个粒子,它会影响它附近以及远处约束距离,
小目标)我们需要一个线性系统。
e)当这条线变长或变短 ,粒子需要移动回restlength的长度。 一次只计算一个粒子的约束条件,随着解算迭代次数增加,这些拉伸的距离会越来越接近restlength。
问题)线性系统不能并行计算
解决方案)iteration不断的迭代
我们需要考虑同一时间,所有相连的约束条件,不是在所有点上运行所有的约束,只从一点出发的所有约束条件,计算这些位移。然后求一个平均值;
例子)
例如一个粒子。
两个约束条件,我们要把a和b加起来除2,并相应的移动粒子 。
然后一次次的重复这个过程,它会收缩到正确的位置.
○ 节点 ○
小目标1)需要一个遍历所有粒子
解决方案)所有粒子的信息,同时约束信息
04-4)pointwrangle命名satisfy_constraints:
a)input_2连接“槽2”
b)
//-- 1 读入约束条件,所有当前进程相关的prim
int myconstraints[] = pointprims(1,@ptnum);
//-- 2 初始化位移,重量
vector displacement = {0,0,0};
float weight = 0.0;
//-- 3 遍历所有约束,这些是当前进程约束,然后必须传递其他约束数组
foreach(int constraint; myconstraints){
//-- a 现在处理所有prim,计算所有点的偏移。从prim中个读出这些点
int constraintpnts[] = primpoints(1,constraint);
//-- b 这些点的位置,约束第一个点posa 第二个点posb
vector posa = point(0,“P”,constraintpnts[0]);
vector posb = point(0,“P”,constraintpnts[1]);
vector delta = posa - posb;
float deltalength = length(delta);
//-- c 读出净值长度值
float restlength = prim(1,“restlength”,constraint);
//-- d 计算两者之间的差别
float error = (restlength - deltalength)*0.5;
float dir =0;
//-- 检查方向
if(constraintpnts[0] @ptnum){
dir = 1.0;
}
else{dir = -1.0;}
displacement += normalize(delta)errordir;
weight += 1.0;
}
@P += displacement/weight;
小目标2)增加固定点
04-5)pointwrangle命名pin
if(@ptnum == 0){@P = {0,1,0};}
小问题)被拉伸的很长却没有弹性
分析)没有对约束进行迭代,只满足了一次的约束条件
解决方案)需要在一个循环中运行约束条件
1)增加For-Loop with Feedback节点
迭代值提高Iterations=20
小目标3)增加约束的硬度
解决方案)增加for循环的迭代数=100
小目标4)让Pin更有趣些
解决方案)grid的一个角点id,在40帧后起作用
else if(@ptnum ==380 && @Frame >40){
@P={0,1,1};
}
公众号:微信号
第079封“情书”:“I服了You”Cloth Solver From Scratch<Entagma>Houdini 2018相关推荐
- 蝙蝠侠一键改udid软件_对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书...
蝙蝠侠一键改udid软件 by Kunal 由Kunal 对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书 (For your first HTML code, let's help Batma ...
- 第075封“情书”:百撕不得其解Tearing Cloth<Entagma>Houdini 2018
▉通往自由的路上充满了撕扯狡诈,与阴谋,难道"卑鄙是卑鄙者者的通行证"是真的?- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdin ...
- 第077封“情书”:弯弯绕<Entagma>Houdini 2018
▉ 我命硬学不会弯腰- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdini的情书"] █命运,就算你想尽一切办法,也休想压弯我追求理想的执着 ...
- 《致盛夏的七封情书》 ------------ 第一篇《晨曦》
写了一个短篇小说,<致盛夏的七封情书>,一共七篇,采用拼凑式的记述和多位不间断的场景转换,讲一个小小的爱情故事,不精美,也不感人,纯粹给目前毫无道理的无望生活找一点存在感. 第一篇< ...
- 第023封“情书”: 草书 Point Advection点的平流染色线
▉又一波韭菜长好了,该收割了,各位庄辛苦了! 像一棵 海草 海草随波飘摇,海草海草海草,随风飘摇!海草 海草浪花里舞蹈,海草 海草管它骇浪惊涛我有我乐逍遥,人海啊 茫茫啊随波逐流浮浮沉沉. 庄:韭菜的 ...
- 第068封“情书”:耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据
第068封"情书":耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据 每一天都是神的恩赐,请不要辜负. ▉ 热情在慢慢消退,逐渐冷却,惰性的冰川大兵 ...
- 从零学编程1-写一封情书
一哥们闲暇之余想学编程,博主作为"会装系统的人"自然脱不了干系,这哥们名字叫鹰,初中文化,对于电脑的认识属于只会上网听歌看电影,差点忘了他强调过CF玩的不错. 那就教起吧. 主人公 ...
- 阿狸给桃子的999封情书(123封)
阿狸给桃子的999封情书(123封) <第一封> 我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉. <第二封> 我不生气,因为身体是自己的:我不伤心,因为心 ...
- 第060封“情书”:相对论 Signed Distance Outlines Houdini
第060封"情书":相对论 20180507 Quicktip- Signed Distance Outlines<Entagma>Houdini 2018 ▉ 中国 ...
最新文章
- spark提交到yarn_详细总结spark基于standalone、yarn集群提交作业流程
- RDKit | 基于分子指纹的相似性图
- 深耕大数据市场,所问数据打造深度学习数据分析与预测引擎
- 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
- 网易模板html,163企业邮箱HTML网站模板
- 百度网盘小程序互转工具:wx2正式开源!
- BZOJ1725 牧场的安排
- Content management workbench DMWB
- 一类动词二类动词三类动词_基于http动词的完全无效授权技术
- tesseract-orc 合并识别结果
- 控制台打印菱形和方形
- java 中PriorityQueue优先级队列使用方法
- luogu P3810 【模板】三维偏序(陌上花开)
- 三元运算符最终结果的数据类型
- DXperience中文视频教程(上)
- kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击
- 软件工程(成本/效益分析)
- Android混淆使用详解
- 苹果怎样添加无线网络连接服务器,教你iphone8 icloud连接服务器时出错怎么办及苹果手机如何设置成指定名称的WiFi热点...
- Spring知识整合(主要SSM)