Houdini模拟雪球碰撞

Houdini模拟雪球碰撞

首页休闲益智雪球来了3D更新时间:2024-05-11

建立流体发射源

创建Sphere球体模型,创建isooffset节点进行雾化填充,然后连scatter节点,将模型转换为点

接着创建Attribute Create节点命名为Snow_Viscosity,通过这个节点创建属性viscosity,值为4000

然后创建一个NULL命名为POUT作为流体的发射源,完整链接图如下所示

模拟解释

因为现实中的雪撞击地面是呈现块状散开的,因此我们需要将scatter后的球体分为多个部分,大致我们来将球体分为多个部分,也就是成立多个中心点,在这中心点周围包裹着许多点,可以借助add及fuse节点来模拟一下

接着上面的节点进行设置,在Geometry层级中,创建add及fuse,命名为add1和fuse1,add1中点击Particles选项,勾选Add Particle System(控制是否建立Primitive粒子系统),

选中fuse1,在 Consolidate选项中的Distance值设置为0.7,创建一个球体、一个copy节点和一个merge节点,连接一下:

下面就是模拟的形态

红色的点就是中心点,后面会通过节点实现以红色点为中心指定半径内的点作为一个整体,在碰撞的时候进行分离。

建立动力节点

创建DOP Network,双击进入动力学节点层级,在这里面创建FLIP Object及FLIP Solver两个节点分别命名为Flip_Object和Flip_Solver

Flip_Object的input Type设置为Particle Field ,SOP Path选POUT,如下图所示:

在Flip_Object的Properties选项下的Physical中设置Density值为100(这个值是决定场密度的值,会影响体积速度,越大速度大)

在Flip_Solver的Volume Motion选项下的Viscosity选项中勾选Endble Viscosity及Viscosity by Attribute,可看到viscosity属性被激活了,

Viscosity是代表流体黏性的属性,值越大流体越粘稠,下面的实验可以看出

在Particle Motion选项下的Behavior选项中取消勾选Kill Outside Volume Limits,勾选Add ID Attribute及Use Friction and Bounce

在Reseeding选项中取消勾选Reseed Particles(这个是用于设置水化模拟的效果,值越高体素内创建的水花越多)

在Volume Motion选项下

Update Surface :none【控制每个Subsetp结束时如何更新曲面的SDF以便匹配粒子的速度】

Update Velocity :none【控制每个Subsetp结束时如何更新场的速度,以便匹配粒子的速度】

在其下的Collisions选项下

Velocity Type为Volume,勾选Stick On Collision【这么做是为了让流体的速度与碰撞体的速度匹配】

然后创建merge节点,及gravity节点,返回上级节点

选中POUT然后点击Collisions选项中的Ground Plane,建立了一个碰撞地面

创建多重结算器

雪的形态模拟,光靠一个流体结算器是不够的,所以houdini早就准备了多重结算器(Multisolver),除了流体结算器我们还需要一个sop结算器,其实是需要用它来建立中心点。创建SOP Solver,命名为SnowSOP_Solver然后双击进入,创建add节点和Fuse节点,设置跟之前的一样,然后找到dop_geometry进行连接,设置如下图

创建POPVOP进行速度计算

这么做的主要目的是让围绕中心点附近的点获得与中心点一致的速度,这样达到分裂雪堆的目的。

创建一个popvop命名为Snow_POV,设置其Inputs选项下的信息,input1设置为Myself,Input2设置为SOP,SOP Path为/obj/sphere1/dopnet2/SnowSOP_Solver/CENTER_POINTS

然后双击进入VOP节点编辑界面,

利用nearpoint节点计算出我们设定的那20多个中心点,并输出这些点的序列号,

利用getattrib获取这些中心点的位置信息

利用pcopen节点进行一次指定点周围点的计算,并转换为点云文件进行输出

利用pcfilter节点对pcopen所输出的结果进行点过滤,并获得一个输出值,也就是我们所需要的v

VOP完整连接如下图

我们可以对pcopen节点的maxpoints和radius参数进行一个Promote Parameter,这样就能将这两个属性扩展到popvop1的界面参数面板上,方便调试

Search radius:0.3

Number of Points:100

将Snow_POV连接到Flip_Solver的input2(粒子速度)上,然后我们还需要对Flip_Solver进行一个小改动,在Flip_Solver图标上点击鼠标右键,选中Allow Editing of Contents,

出现红色解锁图标就表示已经可以进行编辑了,双击进入

找到advect_vel_by_oldvel、rebuild_vel、advect_surface、rebuild_surface、stash_flipvel、advect_particles4、calc_vec_back_to_flipvel这7个节点并设置为Bypass状态

返回上层级(可先将viscosity属性关闭,后面会利用VEX进行控制),进行动画播放,可以看到如下效果:

可以看到雪球碰撞地面后溅射部分仍旧不断在扩散,看起来很不自然。

结算器连接

Flip_Object连接到SNOW_Multisolver的input1上,Flip_Solver及SnowSOP_Solver分别连接到其input2上

碰撞力、压力和张力的创建

创建Gas Impact To Attributes(会复制碰撞数据到一个点属性上),命名为GAS_IMPACT,这里我们仅需要Add Hit Impulse Attribute(碰撞力度),Default Operation设置为Set Always,这样一来只要播放动画就会生效:

接着我们需要为流体创建压力(pressure)和张力(strain),那么创建两个Gas Field To Particle节点,分别命名为GAS_PRESSURE及GAS_STRAIN

还需要为张力(strain)设置一个矩阵场(Matrix Field),如果不设置的话是无法在Geometry Spreadsheet列表中查看到属性的

创建Matrix Field节点(创建一个矩阵场附加到一个模拟物体上作为结算器操作),然后设置如下

模拟物体对象一般连接在Strain_Matrixfield的input1,

然后将GAS_IMPACT、GAS_PRESSURE及GAS_STRAIN三个节点通过merge节点合并后连接到Flip_Solver的input4上

接着再通过Geometry Spreadsheet列表中查看属性是否已经成功创建

如上图所示,已经成功添加了所需属性

再创建Gas Sand Force(用于将流体模拟为沙子的力) 命名为Snow_GasSandForce,接着创建Gas Advectfield(通过速度场来输送几何体和力场的小型结算器),命名为Snow_GasAdvectfield

下面就是加了Gas Sand Force、Gas Advectfield节点和不加的对比效果

创建POP Wrangel节点,命名为Viscosity_Ctr,并书写以下代码:

if(@viscosity >1)

@viscosity = 3000 * (@pressure 1) / (length(@v) 1);

if(@viscosity>300)

@viscosity = 1000000;//黏度小于300那么黏度为0

if(@viscosity<300)

@viscosity = 0;

if (@hitimpulse > 5) //碰撞压力大于5那么黏度为100000

@viscosity = 1000000;

if(length(@strain)>30)//张力大于30黏度为0

@viscosity = 0;

if(length(@v)<0.5)//速度小于0.5黏度为100000

@viscosity = 10000000;

length函数是计算一个3D或4D矢量的长度

矢量长度Length(Vector)= |Vector|=sqr(x*x y*y z*z)

这段代码是通过雪球在碰撞地面后所受到的各种力的数据来控制黏度的大小,黏度设置100000基本上就是让雪球碎裂出来的部分停止运动。

动力学节点连接图

一个雪球的碰撞模拟就完成了,那么如果是将两个雪球进行相互碰撞又该如何实现?

返回Geometry层级,创建Transform节点命名为Second_SnowTR,调整中心点和位移值,设置如下

用merge节点,将两个雪球合并到一个场景

接着创建两个Point节点分别为雪球加入法线,后面会利用法线作为影响雪球碰撞方向及速度的矢量

然后进入动力学节点,在Snow_POV后面创建一个POP Wrangle节点,命名为Snow_VEX,代码如下:

if(@Frame<3)

@v = @N @v;

更改Flip_Object的SOP Path,应该选择后面增加的POUT2

动力节点层级完整的连接图

Snow_POV的Search Radius、Number of Points参数可调整雪球碰撞后的形态

Flip_Object的Particle Separation 、Particle Radius Scale参数可以对雪球的体素大小进行调整,好了,讲了这么多终于搞完了,大家看完了还是希望把文章分享出去,谢谢!

还是附上完整连接图

Houdini

后期中的*神器

您得 学一学 ~~

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved