Maya粒子-水滴表面流动效果

视频:http://v.youku.com/v_show/id_XNDQwNTE4Mzg4.html

以前曾经做过一个基于打湿贴图的maya粒子打倒表面产生的喷溅效果,适合做油漆等不流动的水滴,如果像车窗表面、液体沿着脸留下来(…)等效果,可以用接下来的方法。




如上图,整个系统可以分解为4种粒子:

  1. 自由水滴,普通粒子加个gravity field。和物体碰撞,event中产生第2种粒子和第4种粒子。
  2. 引导粒子,也是表达式中主要要对付的粒子,负责弯弯曲曲的沿着表面往下移动,并且发射第3种粒子。
  3. 轨迹水滴,被引导粒子发射出来,形成水滴流过的痕迹。
  4. 喷溅粒子,自由水滴打到表面后溅出来的粒子,没什么特别。
呐,以下就是 引导粒子的粒子表达式,场景中有一个closestPointOnMesh节点需要预先建立,并且把用来流淌的模型连到节点的inmesh上。这样每次设置不同的inposition,从outposition里取出来的就是inposition靠近inmesh最近的点。

[cpp]  view plain  copy
  1. particleShape3Shape.velocity = <<0,0,0>>;  
  2.   
  3.   
  4. // pos  
  5. float $noiseScale = 1.4,$overallScale = 0.05;  
  6. float $displacement = 0.05;  
  7. vector $pos = particleShape3Shape.position;  
  8. $pos+=<<noise($pos),noise($pos+<<100,0,0>>)*0.2,noise($pos+<<0,100,100>>)>>*$noiseScale*$overallScale;  
  9. $pos+=<<0,-1.5,0>>*$overallScale;  
  10. setAttr closestPointOnMesh1.inPositionX ($pos.x);  
  11. setAttr closestPointOnMesh1.inPositionY ($pos.y);  
  12. setAttr closestPointOnMesh1.inPositionZ ($pos.z);  
  13. float $px,$py,$pz,$nx,$ny,$nz;;  
  14. $px = `getAttr closestPointOnMesh1.positionX`;  
  15. $py = `getAttr closestPointOnMesh1.positionY`;  
  16. $pz = `getAttr closestPointOnMesh1.positionZ`;  
  17. $nx = `getAttr closestPointOnMesh1.nx`;  
  18. $ny = `getAttr closestPointOnMesh1.ny`;  
  19. $nz = `getAttr closestPointOnMesh1.nz`;  
  20.   
  21. vector $pos2 = <<$px,$py,$pz>>+<<$nx,$ny,$nz>>*$displacement;  
  22. vector $lastpos = particleShape3Shape.lastPos;  
  23. if(abs($pos2.y-$lastpos.y)<0.0001){  
  24.     particleShape3Shape.lifespanPP = 0;  
  25.   
  26.   
  27.       
  28.     if(dot(<<$nx,$ny,$nz>>,<<0,-1,0>>)>0){  
  29.         emit -object particle1 -pos ($pos.x) ($pos.y-0.01) ($pos.z);  
  30.     }  
  31. }  
  32. //print(id+": "+abs($pos2.y-$pos.y)+"\n");  
  33. particleShape3Shape.position = $pos2;  
  34. particleShape3Shape.lastPos = $pos2;  

原理是这样的:
  1. 把速度清零
  2. 基于noise函数生成一个随机向量,加在目前的pos上,制造曲折效果
  3. 讲pos往重力方向移动
  4. 如果只是2和3两部,粒子极有可能会离开了物体表面,所以接下来进行了一次判断,取出移动后的目标位置所对应的最靠近mesh的点(通过ClosestPointOnMesh),判断一下和上一帧的pos在y轴的差,如果差很小,也就是说粒子基本没有往下落,说明流到了一个比较平的位置,那么接下来分两种情况,5和6:
  5. 如果最近点处的法线点乘重力方向大于0,也就是说这一点法线是朝下的,那么水滴应该脱离表面,成为一个自由水滴,其他的喷溅啊继续生成引导水滴啊交给我们架设好的系统。
    这一点如果仔细看视频就可以看到,在弯弯曲曲的留到圆环或者圆锥的最下面后,会掉下来,继续在下面的斜面上流淌。
  6. 如果点乘小于0,也就是朝上的,那么水滴是没法穿透物体往下的,所以就让它消失吧。
大家久等,文件终于找到了,统一回复:
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值