加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Particle morph with ParticleFlow tools box#3 (Part-2)

(2012-03-17 00:39:00)
标签:

杂谈

分类: 原创


《Particle morph with particleflow tools box#3 (Part-2)》

《使用PF box3完成A→B的粒子变换特效(下部)》

 

本文承接:《Particle morph with ParticleFlow tools box#3 (Part-1)》

 

前言:

3ds Max的pflow粒子系统自带的Find Target Operator能够部分实现粒子物体从A形态变换为B形态的功能,但效果有时候不是太给力。本文分成若干个步骤,讲解了使用pflow粒子外挂插件“particleflow tools box#3”中强大的粒子数据操作能力来制作自定义的粒子形态变换效果,以及将制作出来的变换效果整理、打包、封装成新节点以供其他特效师使用的方法,同时也介绍了particleflow tools box#3的大致使用方法、思路与流程。

 

整体思路:

记录每粒子在原始物体A表面(或体积、顶点、线)上的位置,记录每粒子在目标物体B表面(或体积、顶点、线)上的位置,然后定义由A到B的变化过程。

 

具体实现分为四部分:一、基础实现;二、进入box3数据操纵环节;三、粒子的速度控制和形态控制;四、封装功能节点。

三、粒子的速度控制和形态控制

现在的效果还有很大的改进空间:1、速度上:粒子刚开始速度太快,粒子在靠近目标物体时又太慢,而且粒子的速度暂时没有办法得到精细的控制;2、形态上:粒子变换的运动形态太单调,全是直线运动。因此接下来就这两点问题进行改进。

 

Ps:在实际的制作过程中我绕了很多个弯才得到现在的结论与清晰的思路,在本文的撰写过程中我会省去绕弯及思路混乱的过程,直接以清晰的思路一步一步推进到最后的结果。

 

1、现在的方式是直接控制粒子的vector,而这个vector包括了“速度方向”及“速度强度”两个量。现在的控制方式的结果是粒子的“速度方向”会一直指向目标物体,这点没错,但是粒子的“速度强度”会随着离目标物体越近而逐渐降低,因此速度就越来越慢。

接下来我需要单独控制“速度方向”和“速度强度”,打开事件3中的dt_closeToTarget,修改如下图23:

图23

 

Normalize将速度方向做归一化处理,将速度矢量完全方向化了(其实不加这个Normalize效果也一样,之后才发现的,个人感觉加了后更容易理解)。另一方面Speed Magnitude,也就是之前说的“速度强度”被一个Scalar节点所控制,输入的值被固定为0.01,也就是粒子变换的速度固定为0.01。播放时间轴,发现速度不会随着离目标物体越近而变慢了,见图24。

"http://s13/middle/760e11a94c559d4e6b6cc&690"

图24

 

至此的源文件:DataOP_closeToTarget_onTest_v06_word_step04.max

 

2、依旧是打开事件4中dt_closeToTarget的数据流程图,接下来改进粒子的运动形态,使粒子不朝着一条直线运动的方法,在这里我用了一个Random Suboperator,并设置为Turbulence函数,使用Turbulence函数产生的随机vector去和原始的速度vector做加法运算,这样粒子方向就被扰乱了,见图25。

图25

 

从图25可见扰乱产生了,但是继续播放,发现有部分粒子永远没有办法回到目标物体的模型表面上,这是因为越到接近目标物体,粒子的原始速度vector就越小(三个轴的值都在减少),而Turbulence所产生的vector却一直不变,直到离目标物体近到一定距离的时候,原始速度vector已经刚好能够和Turbulence产生的vecotor所抗衡的地步,粒子也就没法再运动下去了,见图26。

图26

 

3、因此我想要Turbulence产生的vector和原始速度vector有某种乘法上的关系,当离目标物体越近的时候,Turbulence vector也会越小,这样就能够达到目标物体上了,动手实现这个思路,见图27。

"http://s5/middle/760e11a94c559d4fcff34&690"

图27

 

图27中的乘法关系中,Turbulence为什么还要Normalize一下?因为Normalize之后不管Turbulence的强度值多大,生成的vector都不会太大(三个轴的值均在-1到1之间),便于控制粒子的行为不失控,Normalize后乘以0.6这个乘数是为了让接下来的运算中,扰乱产生的vector强度永远都会比原始速度vector的强度小。在这里0.6这个乘数的范围建议在-1到1之间,大于等于1或者小于等于-1均会导致粒子飞逸,大量粒子永远到不了目标物体上。

 

至此源文件DataOP_closeToTarget_onTest_v06_word_step05.max

 

播放时间轴,现在的形态、动势已经成型了,Krakatoa渲染测试效果如图28,29,30。

图28

图29

图30


 

效果还可以,如果感觉满意的话,那么本文到此就可以结束了,不过如果我们对“速度强度”也进行随机化处理的话,效果可能会更好。

 

4、Turbulence的输出结果是一个矢量,而“速度强度”Speed Magnitude是个标量,因此中间使用求矢量长度的Function算一下就好,见图31。

图31

 

5、“速度强度”的随机导致了有些粒子速度很快,有些速度很慢,速度快的粒子和速度慢的粒子速度差距很大,以至于播放到200帧都还有很多粒子在半路上,因此接下来要控制“速度强度”随机的范围,这一步的思路其实实现的方式会因人而异,因此以下仅仅是我实现随机范围可控的节点连接图,见图32。


图32

 

对粒子变换的中间某一帧进行渲染,得到效果如图33,和图29进行比较,发现形态上更好了。

图33

 

至此的源文件为:DataOP_closeToTarget_onTest_v06_word_step06.max

 

6、播放动画,现在的结果是粒子变换的过程中紊乱形态已经差不多了,剩下问题就是速度现在是匀速的----虽然每个粒子的速度都不一样,但是从单个粒子来看,粒子在变换的过程中速度是恒定的。

接下来仍然是对速度的控制,我想让粒子在变换的初期速度为现有的恒定速度,但是当离目标位置的距离小于某个值的时候,速度就开始逐渐变慢,直到变为“最低速度”然后抵达目标位置进入事件4。

在这个过程中需要定义的是一个过渡值,当这个值为1的时候,粒子完全使用初始恒定速度,当这个值为0的时候,粒子完全使用自定义的“最低速度”。

把大体框架在dt_closeToTarget的数据流程图中实现,得到如图34。

图34

 

图34中有一个过渡量,暂时用Scalar节点来作为输入,当scalar的值为1的时候,完全使用初始恒定速度,当这个值为0的时候,完全使用自定义的最低速度(如图34),介于之间的时候就是“减速带”了。

这个过渡变量不可能是个恒定值,否则就失去了意义,要么让这个变量根据时间而变化,要么根据距离而变化。根据时间而变化可以通过k帧或者和粒子的年龄建立关系来实现,但我的思路是利用粒子到目标物体的距离变化来实现,思路及实现如图35。

图35

 

按照图35中的设置,播放动画,减速缓冲汇聚成型的效果就比较明显了。

 

7、最后再使用那个过渡的Function的Post-Factor来做一个乘法关系,可以在这个Post-Factor上整体缩放以影响整个变换过程所持续的时间,也可以k帧,Parameter Animation Sync方式建议选择“Event Duration”,这样速度控制起来就很细腻了,见图36。关于Event Duration可以参阅max的help。



图36

 

在Post-Factor上k个动画,就能实现开始慢,中间快,最后又慢的变换过程了(图37)。

图37

 

至此源文件:DataOP_closeToTarget_onTest_v06_word_step07.max

 

8、为了增加粒子变换的细节及动态效果,我在dt_closeToTarget后面加了个Force节点,并创建一个Wind SpaceWarp,调整如下图38。

图38

 

Krakatoa测试渲染结果如下图39,可以看到添加Wind后细节和动态得到进一步提升。

图39

 

至此源文件DataOP_closeToTarget_onTest_v06_word_step08.max

 

调整渲染参数,提升粒子数量至200w,渲染其变换过程某一帧效果如下图40。

图40

 

9、到这一步,particle morph的功能已经基本做好了,效果也ok,不过笔者在连接Dt_closeToTarget数据流程图的过程中,无意的发展出了另一套扰乱模式,使用该模式效果如下图41。

图41

 

这个模式所产生的效果形态看起来很有张力,但形成这种效果确是意料之外的事。该模式使用到了Function节点中的Sign函数以及Switch节点用于两种模式之间的切换,见图42。

图42

 

关于Sign函数:

sign(x)或者Sign(x)叫做符号函数,在数学和计算机运算中,其功能是取某个数的符号(正或负): 

当x≥0,sign(x)=1; 

当x<0, sign(x)=-1;

 

至此的源文件:DataOP_closeToTarget_onTest_v06_word_step09.max

 

 

四、提取参数、封装节点流程图,完成“粒子变形”功能节点的编写

1、提取参数:对于效果的制作已经完成了,接下来笔者要提取dt_closeToTarget节点流程图中所有和效果有关的参数,将这些参数暴露在dt_closeToTarget的节点参数面板上,这一步完成后,不但实现了粒子变形的效果,还制作出来了用于完成粒子变形效果的一套可重用的Particle Flow节点,以后再制作类似的效果就只要调参数就可以了。

 

现在的节点图及需要提取出来的参数见图43(第二套扰乱模式稍作了点修改)。

图43

 

提取参数的方法如下图44,45。

图44

图45

 

整个添加参数及调整UI效果需要花些时间,添加完毕后的dt_closeToTarget参数集合如下图46。

图46

 

2、封装节点流程图:最后一步可以为我们花心思做好的节点进行密码保护,将内部参数进行透明化处理,见图47。


图47

 

至此,A物体到B物体的粒子变换效果及变换功能节点dt_closeToTarget、do_makeTarget、do_stayTarget就全部制作完成了。

 

最终完成的源文件:DataOP_closeToTarget_onTest_v06_word_step10.max

 

全文完。


所有max源文件下载地址:http://dynamic.xlpan.com/file/167580302/9d230477-f49b-49e2-9889-cfbf7f0029c3

版本:max2011

附带个动态拍屏



 

 

本文系原创,转载请著名原文出处:http://hi.baidu.com/cg_mike/blog/item/38b7ba76c6dc0604b151b94e.html










  

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有