▉ 我从来不会对任何人任何事投降,直到遇见你。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】

█城头变幻大王旗:曾经面对刁钻的甲方,很多人都乖乖投降,我却仍负隅顽抗,但最后还是举了白旗,一遍遍的改,改到面目全非。


前言不搭后语

没什么会永垂不朽。

别灰心,人生就是这样,起起落落落落落落落落。

本节内容

搭建一个布料模拟系统

本节要实现效果


今天是42岁
052周日

79
这是写给Houdini的第079封“情书”

我是geo流程图

我是solver流程图


我是vex代码

重力

// --创建一个重力属性

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集成。

02)推导Verlet积分公式。
03)实现粒子系统。
04)实现Verlet集成。

05)约束理论。

06)实现约束循环
理论
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

接下来
正式制作
使用软件:houdini17.5
01 实现粒子系统

○ 节点 ○


○ 具体操作 ○

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下坠–


02 实现verlet integration

○ 节点 ○


○ 具体操作 ○

04-3) pointwrangle命名verlet_intergration

//-- 套用公式,Timelnc=全局变量

@P += (@P - oldx)+ force*@TimeInc*@TimeInc;

//-- 更新

v@oldx = tmp;

—粒子系统下落的grid的粒子形成的—

小目标)设置约束

解决方案)

使用prim创建一种简单的定义约束方法:

创建连接两个粒子(受约束)的一条线。

执行)

    05)convertline:

a)创建restlength用于“约束迭代步幅”

b)连接solver的接口2;

03 约束理论

约束理论分析)

a)粒子受它们之间连线的约束;

b)这些线有一个restlength静止长度;

c)当force拉粒子时,会扭曲grid,约束线被拉长,

d)这时solver这些约束,因为移动一个粒子,它会影响它附近以及远处约束距离,

小目标)我们需要一个线性系统。

e)当这条线变长或变短 ,粒子需要移动回restlength的长度。 一次只计算一个粒子的约束条件,随着解算迭代次数增加,这些拉伸的距离会越来越接近restlength。

问题)线性系统不能并行计算

解决方案)iteration不断的迭代

我们需要考虑同一时间,所有相连的约束条件,不是在所有点上运行所有的约束,只从一点出发的所有约束条件,计算这些位移。然后求一个平均值;

例子)

    例如一个粒子。

        两个约束条件,我们要把a和b加起来除2,并相应的移动粒子 。

        然后一次次的重复这个过程,它会收缩到正确的位置.

04 实现约束循环

○ 节点 ○


小目标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};

}





教程翻译自entagma的网络教程
下一节::20181224 Production Setup Walkthrough- Color Dust Explosion
电子邮箱:oneinchtime@126.com

公众号:微信号

第079封“情书”:“I服了You”Cloth Solver From Scratch<Entagma>Houdini 2018相关推荐

  1. 蝙蝠侠一键改udid软件_对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书...

    蝙蝠侠一键改udid软件 by Kunal 由Kunal 对于您的第一个HTML代码,让我们帮助蝙蝠侠写一封情书 (For your first HTML code, let's help Batma ...

  2. 第075封“情书”:百撕不得其解Tearing Cloth<Entagma>Houdini 2018

    ▉通往自由的路上充满了撕扯狡诈,与阴谋,难道"卑鄙是卑鄙者者的通行证"是真的?- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdin ...

  3. 第077封“情书”:弯弯绕<Entagma>Houdini 2018

    ▉ 我命硬学不会弯腰- 每天翻译一篇教程,这就是我写给houdini的情书.[首发于同名公众号:"致houdini的情书"] █命运,就算你想尽一切办法,也休想压弯我追求理想的执着 ...

  4. 《致盛夏的七封情书》 ------------ 第一篇《晨曦》

    写了一个短篇小说,<致盛夏的七封情书>,一共七篇,采用拼凑式的记述和多位不间断的场景转换,讲一个小小的爱情故事,不精美,也不感人,纯粹给目前毫无道理的无望生活找一点存在感. 第一篇< ...

  5. 第023封“情书”: 草书 Point Advection点的平流染色线

    ▉又一波韭菜长好了,该收割了,各位庄辛苦了! 像一棵 海草 海草随波飘摇,海草海草海草,随风飘摇!海草 海草浪花里舞蹈,海草 海草管它骇浪惊涛我有我乐逍遥,人海啊 茫茫啊随波逐流浮浮沉沉. 庄:韭菜的 ...

  6. 第068封“情书”:耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据

    第068封"情书":耶路撒冷Assembling a 3DScanOfTheEarth可视化地图数据 每一天都是神的恩赐,请不要辜负. ▉ 热情在慢慢消退,逐渐冷却,惰性的冰川大兵 ...

  7. 从零学编程1-写一封情书

    一哥们闲暇之余想学编程,博主作为"会装系统的人"自然脱不了干系,这哥们名字叫鹰,初中文化,对于电脑的认识属于只会上网听歌看电影,差点忘了他强调过CF玩的不错. 那就教起吧. 主人公 ...

  8. 阿狸给桃子的999封情书(123封)

    阿狸给桃子的999封情书(123封) <第一封> 我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉. <第二封> 我不生气,因为身体是自己的:我不伤心,因为心 ...

  9. 第060封“情书”:相对论 Signed Distance Outlines Houdini

    第060封"情书":相对论 20180507 Quicktip- Signed Distance Outlines<Entagma>Houdini 2018  ▉ 中国 ...

最新文章

  1. spark提交到yarn_详细总结spark基于standalone、yarn集群提交作业流程
  2. RDKit | 基于分子指纹的相似性图
  3. 深耕大数据市场,所问数据打造深度学习数据分析与预测引擎
  4. 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
  5. 网易模板html,163企业邮箱HTML网站模板
  6. 百度网盘小程序互转工具:wx2正式开源!
  7. BZOJ1725 牧场的安排
  8. Content management workbench DMWB
  9. 一类动词二类动词三类动词_基于http动词的完全无效授权技术
  10. tesseract-orc 合并识别结果
  11. 控制台打印菱形和方形
  12. java 中PriorityQueue优先级队列使用方法
  13. luogu P3810 【模板】三维偏序(陌上花开)
  14. 三元运算符最终结果的数据类型
  15. DXperience中文视频教程(上)
  16. kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击
  17. 软件工程(成本/效益分析)
  18. Android混淆使用详解
  19. 苹果怎样添加无线网络连接服务器,教你iphone8 icloud连接服务器时出错怎么办及苹果手机如何设置成指定名称的WiFi热点...
  20. Spring知识整合(主要SSM)

热门文章

  1. 红石电路吧计算机教程,我的世界红石基本逻辑门制作教程
  2. 超薄广告灯箱的导灯板如何清洁?
  3. 根治任务栏天猫618超级红包广告(简单高效)
  4. JavaScript 基础学习笔记
  5. 重邮计算机专业取得奖项,重庆邮电大学移通学院学子在2019中国大学生计算机设计大赛全国总决赛中喜获四项国家级奖励...
  6. 英特尔锐炫 A770、A750 评测
  7. 关于不死兔子的编程题**
  8. 文件服务器 选型,普通文件存储服务器选型原则
  9. js搜索关键字,并高亮显示
  10. 文件上传下载和Excel读写全家桶