婷婷旅游课堂
新浪微博
微信
当前位置:婷婷旅游课堂网 » 电脑

flip案例-cgs河流教程总结

结合一个案例 了解flip模拟 和控制的基本思路,(重新弄下),  渲染部分 后面再补上。

河道的制作

定位尺寸  12米长  7米宽

河道部分我是画两根线  分别在线点上拷贝球体 球体加noise,  然后和地面grid cookie, 切掉下方的, 再和挤压出体积的grid合并,vdb

 

另外在河道上先铺一层水这样模拟起来 水对水撞击更有细节, 河道上也可以加noise.  同时河道上面做一些坑坑洼的细节.

 

顺斜面河道摆放一个box  cookie,  pack  选择出中间部分 unpack,  和河道中的石头cookie.  然后Remesh 让模型布线均匀.

 

中间那块岩石做法, 两个球noise  merge, 做一个打球 包裹着两者,沿大球法线反方向映射,最后remesh一下.

 

FluidSourceflip数据, SourceFlip预设他会添加surface   vel  以及在体积内填充粒子, 速度是沿河道向下的方向(0,0,-2)


 

 

河道上方也用几个box作为发射源, 也设置向下的速度.

最后在石头位置做一个VDB体积, 用于模拟中加强这里的Confinement.


 

DOP设置

0.035精度,   sourcevolume1是导入发射源, 使用sourceFlip预设,sourcevolume2只在第一帧发挥作用把点拿进来就行了.


 

子步幅2,   ParticleMotion:  碰撞检测用粒子方式, 默认Reseeding;

VolumeMotion:  速度光滑 0.05     碰撞中速度类型用Point方式, 开启Stick 这样流体和地面能有粘连 出很棒的效果

另外解算时取消勾选Solver下的Use Pre选项让流体多线程解算.

输出三种数据:


 

模拟结果如下:

D键设置中, Pixel显示粒子比较好,再根据速度 设置颜色渐变 控制粒子. 得到dop中可视化的效果.


 

  

上层表面Mesh提取

思想是把Mesh稍微收缩下同样再把Mesh转点, 把这些点 Y负方向映射到收缩的Mesh,因为底部点肯定在底部Mesh上方,

 顶部点肯定在顶部Mesh上方映射时  只有顶部点会撞击到Mesh.

那么映射时把这些撞击点存到一个组中, 在把组拷贝给原始的mesh  即可把原始mesh这些位置处打组.


 

映射时不变换点, 拷贝组时  点和mesh点位置是一致的.


只是一种比较完美的且简单的提取表面Mesh的方法,


 


Mesh中提取发射源

思路是计算速度场的涡流, 根据涡流 提取发射源. vdbAnalysis   vdbvertorMerge

 


 

 

如图是提取出的发射源, 思路是计算场的涡流,把涡流赋予Mesh颜色, 删除涡流小的地方, mesh上撒点 作为发射源.


 

foam粒子模拟

从所有点发射, 对水面下方的粒子进行Advect, 水面上方的不管(这里做了渐变控制, 水面上方00.5的范围也会被Advect)

其次 跑到水面下方的粒子强制把位置置换到水面表面.

寿命上 涡流大的地方寿命小, 涡流小的地方 寿命大, 默认寿命1000


 

 


 

 


因为这里的曲面是水平的 直接乘以(0,-1,0)  得到的泡沫分布更广,更符合现实,之前那种梯度方向方式得到的泡沫很线条化.

如果水面不是水平的 需要采样梯度 得到置换方向, 再将置换方向乘以距离值 加P得到置换后的位置.

 

 

 

这一步得到了基本的泡沫效果  但数量远远不够,下面插值泡沫


 

 


mantra节点   mantraSurface材质 赋予Geometry节点,     Render as Point

pscale属性   0.007 

渲染成点 可以看出这些都是单个点   得增加粒子点数量



1.1-vop中点线思想

一种是用PointReplicate节点 简单 但效果不好  速度慢, 他只是在点周围创建一些点, 肯定不行. 我们要那种泡沫结构.

得到类似泡沫的结果, 首先要在这些点之间创建线.


addPrim节点  addVertex节点

必须先撒两个点, 怎么在这两点之间连线? 一根线是由两个vertex  一个prim组成的.



提供Prim, 顶点就可以组成一条线,这里意思就是将这两个顶点 加到Prim上 形成一个线的基本元素,就能连成线.

即使是撒四个点他连接的仍然是0,1号点  因为addVerrtex中 设置的是这两个点.

 

如果想对另外两个点也连接同样 拷贝上面的节点, 设置2,3号点连接就行了但这样做肯定不行 必须程序化完成批量的连线,


 

 

1.2-点云搜索 连线

以原点为参考点  获取他的最近点, 并存储这个点的序号到原点上,用于后面调用.


pcimport by index 节点是抓取明确的点索引号上的点属性不是平均点云中的属性  pcfilter不同, 他是基于点的索引号, 索引号是按近到远对点依次排序.

有两个属性point. number是这个点的点序号,point .distance 距离参考点的距离

pcfilter是平均化操作  10个点的属性值平均

op:`opinputpath(".", 1)`获取第二个输入

 

因为合并撒点后, 原点的点序号变成了30, 所以用getAttrib30号点上获取closet属性, 其实就是18. 然后对30号点, 和这个最近点连线.


 


 

index0的点和第一个最近点连线, 和第二个最近点连线,和第三个最近点连线.....和最后一个最近点连线.


 


1.3-程序化连线


 

 

得到线还不行我要的是点 可以重采样线 , 这样单纯的打碎不好 咱们可以自己去在两点之间创建点  并设置原画的过度.


 

2.1-创建点思想

沿着线创建点


 

2.2-放置多个点

首先第二个点和第一个点相减得到相互指向的向量




2.3-for循环创建多个点


 


 

 



 


 

不乘旋转 矩阵结果是平面的每个点 都有数值向量的向量信息而位置信息中也包含二次方的变换,  相乘后 就是这样乘旋转矩阵后 就是立体的.

这里重点是那种弯曲分布的效果不是很好理解.

 


 

把这个撒点运用到循环中

做法和之前一样, 只是要在外面嵌套一层循环


 

pcnumfound---搜索到的点总数

 

出现很多和中间点相连的情况是因为搜索范围内找到的点数量比循环次数少,导致循环不了

而用pcnumfound节点可以找到搜索半径内的点数, 循环次数也就是这个值

而内循环中的循环次数是撒点的个数.


 

 这里学习下Vop中 点是添加 点云  for循环等用法.

 

 

雾气的制作

雾气的做法和泡沫类似, 也是找到高度紊乱的区域, 因为我们已经做好了发射泡沫的粒子, 这里可以直接用它来做泡沫的发射源

 

碰撞上需要地面  中间那个石块, 流体就不必加了.

density属性用Cd的二次方  $CR ^ 2, 这样可以让Density不是完全一样的,有渐变.

 sourceSmoke预设  density temperature   Density场使用noise, 速度场也添加curlNoise


 

因为第一帧上没有任何的density。所以容器一开始是很小的box, 可以把Resize中的delay frames=1,延时一帧再Resize.


 


关于模拟设置:

默认 烟雾往上飞, 但受到速度场的作用 还会往前运动, 很不像雾气  而且前端有蘑菇状的云.

温度上升快(烟雾上升), 可以降低Scale Temperature运动快可以降低Scale Velocity.

 

Dissipation--指烟雾随着时间蒸发的快慢,如果觉得烟雾存在时间较长 增加这个值. 此处是0.1-->0.5

Disturbance--是打碎烟雾边缘,

 

如果感觉很多地方都被烟雾占据了,比如这里的整个发射器区域都是一团烟雾, 那么可以调整Source Volume节点的Scale Source Volume, 此处是1-->0.15

 

 

 

 


相关报道