操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

3DS MAX图文教程:事件驱动粒子系统——喷泉效果

2004-7-15 作者:陈孝强 网友评论 0 条 点击进入论坛

第二部分 事件驱动粒子系统(粒子流)
  本节开始介绍3DS MAX 6.0开始的事件驱动粒子系统(下文一律简称为“粒子流”),我们将会接触到非常多的 3DS MAX 概念和功能,所以请耐心细致地阅读。

  粒子流的功能强大,但制作流程不像非事件驱动粒子系统那样直观。我们将要和“粒子视图”打交道,这个视图由一系列的“事件”组成。一个粒子流源(粒子流的发射源)发射出来的粒子将会经历系列的“事件”,在每一个事件内部,我们可以使用“运算符”设置粒子的各种变化效果(比方受到空间弯曲的影响),事件与事件之间通过“测试”彼此联系,整个粒子系统的设置过程就像是在绘制程序的流程图一般似行云流水,这也是“粒子流”得名的原因之一。

  打个比方来说,粒子流源就是长江源,它发射出来的粒子就如同长江的流水。这些流水沿着长江流动,一部分会遇到大坝(事件)的阻拦,大坝会利用这些水去发电、灌溉(运算符处理),还有一部分水会被放行流到下游,下游又会有其他的水利设施(事件)将其用于其他用途(运算符处理)。

实例四:喷泉效果

  1 、最终效果和实现步骤

  我们将要制作的是一个喷泉,你也许看到过一些利用普通的非事件驱动的粒子系统制作喷泉(也就是前面制作水流、烟雾的那种粒子系统),虽然制作出来的效果也算是差强人意,但是它们有一个致命的缺陷——缺少细节,而粒子流的优势恰在于此。

  逼真的喷泉效果应当是,水流从喷嘴出来之后首先受到重力影响下落,接着遇到风,风会把水花吹成更小的水花,接着水花落进水池溅起涟漪。此外喷泉喷水的速度和数量也有不规则的变化。所有这些效果在制作逼真的场景中都是必不可少的细节,在 3DSMAX 中只有粒子流才能制作这么多的效果。

  随本文一并提供的初始场景中包含一个水池,水池中央是喷泉的喷嘴。水面用一个 Plane (平面)物体制作,添加了 Noise (噪波)和 Ripple (涟漪)两个修改器,并且具有波纹效果。

 

效果

实现方法

水源源不断喷出

PF Source 粒子系统

水花落下

Gavity 空间弯曲

在水面溅起小水花

POmniFlect 空间弯曲和粒子流的 Spawn 运算符共同作用

在水面激起涟漪

Shape Mark 运算符

水花在空中飘散

Wind 空间弯曲和 Spawn 运算符共同作用

  2 、粒子发射源

  1 )打开 Create (创建) ->Geometry (几何体) ->Particle Systems (粒子系统),单击 PF Source 按钮,在场景中任意位置拖动建立粒子发射源,将其命名为“喷泉_PFSource ”。

  PF Source 粒子系统的默认图标是一个矩形,接下来我们需要对其大小和位置进行调整,使之与喷泉的喷嘴匹配。

  2 ) 进入 Modify (修改)面板,在 Emission (发射)卷展栏中选择 Icon Type (图标类型)为 Circle (圆形),因为喷泉的喷嘴是圆形的,用一个方形的发射器显然不合适。然后设置 Logo Size (图标尺寸)为 30 , Diameter (直径)为 3 。


 

[下一页]


 

  3 )单击主工具栏上的 Align (对齐)按钮激活对齐功能(快捷键 Alt+A ),然后单击喷泉的喷嘴物体(这个物体是示例场景自带的,名称为英文 FountainSource )。在弹出的对话框中将 X 、 Y 和 Z 三个方向同时选中。

  4 )这时如果播放动画你也许看到不到粒子发射效果,这是因为粒子发射的方向反了。单击工具栏上的 Select And Rotate (选择并旋转)按钮(快捷键 E )和 Angle Snap Toggle (角度捕捉)按钮(快捷键 A ),这时发射器旁边将出现旋转操作的调节坐标系,锁定 X 轴旋转 180 度,发射器的方向(由一个箭头表示)就指向上方了。

  3 、空间弯曲

  对于制作和粒子系统相关的效果而言,空间弯曲是必不可少的,在这个场景中我们需要三个空间弯曲,分别是 Gravity (重力)、 Wind (风)和 POmniFlect (平面散射挡板),前面两个的作用非常明显,第三个的作用要解释一下,它将阻挡并反弹水花,配合粒子系统的事件设置,形成溅起小水花的效果,具体的制作方法将在后文详细介绍。

  1 )打开 Create (创建) ->Space Warps (空间弯曲) ->Forces (力),单击 Gravity 按钮,在场景中拖动,将其命名为“下落 _Gravity” ,它的参数不需要调整。

         

  2 )选择粒子系统子类型为 Deflectors ,单击 POmniFlect 按钮,在场景中拖动,将其命名为“水面 _POmniFlect ”。注意这种空间弯曲和普通 Deflector 空间弯曲一样,其位置和大小会影响到其作用的发挥。由于我们将用它来模拟水池中水面对落下的水花的反弹效果,因此要调节其大小和位置使之和水池中的水面相匹配。


 

[下一页]


 

  进入 Modify (修改)面板对其参数进行设置,首先在 Timing 中设置 Time Off 为 300 ,也就是和动画长度相等,然后在 Reflection 中 Bounce 为 0.3 。

  3 )打开 Create (创建) ->Space Warps (空间弯曲),单击 Wind 按钮在场景中拖动建立风空间弯曲,将其命名为“风 _Wind ”,其参数可以自己随意设置,不必拘谨。调整其方向指向喷泉。

POmniFlect 空间弯曲
POmniFlect 的名字很独特,它是 OmniFlect 空间弯曲的平面版本,最开始的 P 代表 Planar ,那么 OmniFlect 空间弯曲又是怎么回事呢?前面我们已经介绍了 Deflector 空间弯曲, OminiFlect 其实也是 Deflector 空间弯曲的一种,不过它们的功能不仅仅是将粒子反射回去,而且具有“折射”和“产卵”功能。所谓“折射”是指让粒子穿透过去,同时改变其运动方向,如同光线穿透液体时的折射效果一样。所谓“产卵”是指粒子碰到 POmniFlect 会产生新的粒子,这个功能必须和粒子流的事件配合使用。

POmniFlect 空间弯曲的操作步骤包括:

1 、创建 POmniFlect 发射器

2 、在非事件驱动粒子系统中使用 POmniFlect 时,使用 Bind To Space Warp (绑定到空间弯曲)工具将粒子系统和 POmniFlect 绑定,在粒子流中使用 POmniFlect 时,在粒子视图中为事件添加 Collision (碰撞)测试或者 Collision Spawn (碰撞产卵)测试。

3 、调整 POmniFlect 的参数。

  4 、粒子发射和重力影响

  一直到上一步,你可能都觉得粒子流和前面介绍的非事件驱动粒子系统“差不多”,但是从这一步开始我们要开始使用粒子流特有的一些功能了。这一步需要完成两项任务,第一是设置粒子发射的数量和方向,第二是让空间弯曲“下落 _Gravity ”作用于粒子系统。

  1)打开 Particle View (粒子视图)(快捷键 6 ),这时一个我们以前没有接触过的窗口,下面的背景知识对这个窗口做了介绍。选择Event 01,在其标题栏上单击鼠标右键选择Rename,将其命名为“粒子发射_Event”,后面我们还要建立多个事件,修改事件名称可以避免后面混淆。


 

[下一页]


 

  2)设置粒子的发射时间和数量,选择事件“粒子发射_Event”中的Birth 01运算符,这时右边的窗口将会显示出相应的参数。设置Emit Stop为300,使粒子系统在整个动画过程中不断产生粒子。选择粒子发射数量的设置方法为Rate(发射率),输入一个较大的值,比如300。

  3)如果你的机器速度不是足够快,务必选择Display 01运算符并设置其Visible为一个尽量小的参数,比如10%。这个参数控制粒子在编辑状态下显示的比率,将它设置为较小的值并不会影响渲染效果,但却可以明显制作的流畅程度,如果直接使用默认的100%,很容易出现“卡”的现象。注意,后面新建的事件大多都要进行同样的设置,文中将不再提示。

  4)选择事件“粒子发射_Event”中的Speed 01运算符,在右边设置Speed为300,Variation为30,Divergence为4.0。Variation选项紧靠在Speed参数下面,因此它的作用是对粒子的飞行速度进行随机变化。而Divergence参数的作用则是控制粒子飞行方向的扩散。这些参数和非事件驱动粒子系统中的都是相似的,粒子视图只不过提供了一种不同的设置方式。

  5)现在我们要让空间弯曲“下落_Gravity”作用于粒子系统了,前面介绍非事件驱动粒子系统时,我们使用Bind To Space Warp(绑定到空间弯曲)的方式来做到这一点。对于粒子流,我们要使用不同的方式,这种方式虽然不够直观,但是更加灵活。

在事件“粒子发射_Event”上单击鼠标右键,从弹出菜单中选择Append(添加)->Operator(运算符)->Force(力),然后就可以看到事件“粒子发射_Event”下面多出了一个运算符,名称为Force 01。

  选择Force 01,在右边的属性面板中单击By List(通过列表添加)按钮,然后选择空间弯曲“下落_Gravity”。


 

[下一页]


 

  这时播放动画可以看到“下落_Gravity”的强度太大了,粒子飞出来之后,立刻就被“拉”回了地面,选择空间弯曲“下落_Gravity”,将其Strength参数设置为一个较小的参数。

Particle View (粒子视图)
粒子视图是 3DSMAX 中操控粒子流的主界面。它的界面由四部分组成。

粒子视图内部的操作流程

1 、当我们在场景中添加一个粒子流源之后,在粒子视图中会自动建立一个以粒子流源命名的事件,这个事件是 Global Event (全局事件),在这个事件内部的运算符将会影响该粒子流源产生的所有粒子。和全局事件一道生成的还有一个事件 Event 01 ( Event 01 是系统的默认名称,我们对这个名字进行修改),这个事件中必须包含一个 Birth 运算符,粒子系统才能正常发射粒子。

2 、从下面的运算符库中拖放更多普通远算符到 Event 01 事件内部从而实现对粒子的更多控制。

3 、在 Event 01 事件内部添加 Test (测试)运算符(这种运算符也能在下面的运算符库内部找到), Test 运算符根据一定的条件来确定哪些粒子符合条件,并将其“输出”到其他事件。

4 、添加其他事件,接受 Test 运算符输出的粒子并进行进一步的处理。

  5、溅起水花

  水在重力的作用下落到水池中应当溅起水花,下面我们就来制作这个效果。

  1)从粒子视图下面的运算符库内拖放一个Collision(撞击)测试到事件“粒子发射_Event”内部,放在最下面(你也可以使用上面单击鼠标右键从弹出菜单中选择Append的方式添加,结果是一样的)。

  5、溅起水花

  水在重力的作用下落到水池中应当溅起水花,下面我们就来制作这个效果。

  1)从粒子视图下面的运算符库内拖放一个Collision(撞击)测试到事件“粒子发射_Event”内部,放在最下面(你也可以使用上面单击鼠标右键从弹出菜单中选择Append的方式添加,结果是一样的)。

  2)选择新添加的Collision 01运算符,在右边的属性面板中单击By List(通过列表添加)按钮,选择“水面_POminiFlect”。

  在Test True If Particle(如果粒子出现以下情况时测试返回值为True)下面的Collide中选择Speed为Bounce,这样下落的粒子在碰到空间弯曲“水面_POmniFlect”时会反弹起来。


 

[下一页]


 

  3)上一步中设置的Bounce参数只能让粒子原样弹起来,但是我们希望要的效果是不仅仅是反弹,而是原来的水花消失,同时溅起更多的小水花。这种效果可以使用Spawn(产卵)测试来实现。具体来说就是,事件“粒子发射_Event”中Collision运算符输出的粒子还需要经过一个新的事件处理,这个事件能够让粒子“产卵”——产生更多的小粒子。

  从粒子视图下方的运算符库中拖放一个Spawn测试到上面的窗口,这时会自动创建一个事件,将其命名为“溅起水花_Event”

  4)选择事件“溅起水花_Event”中的Spawn 01测试,在右侧的属性面板中选中Delete Parent(删除父粒子),也就是说,当粒子落到水面溅起小水花时将原来的水花删除掉。然后设置Offspring为较大的值,比如20,也就是一个大水花溅起的小水花的数量,紧接在下面的Variation参数对这个数值进行一些随机的变化。另外还要设置下面的Speed中的Variation和Divergence,这些参数的含义都很明显,不再一一解释了。

  我们将这些参数串起来解释其含义就是,每个水花从空中落到水面后,将溅起大约20个(Offspring)小水花,同时原来的水花消失,小水花的具体数量会有10%(Variation)的波动;这些新产生的水花基本继承原来水花的运动速度(Inherited),但是会有30%的波动,并按照这个速度在一定的扩散角度内(Divergence)向上溅起。

  5)事件“溅起水花_Event”设置好了,那么父粒子从哪里来呢?很显然,落到水面上的粒子就是“产卵”的父粒子。

  拖动事件“粒子发射_Event”中Collision 01运算符的输出手柄到事件“溅起水花_Event”中的Spawn运算符的输入手柄上释放鼠标。

  6)这时如果播放动画可以看到一个缺陷,就是溅起的小水花运动速度有点夸张,像爆炸的弹片一样四散飞离。我们需要添加一个Drag(阻力)空间弯曲来延缓其运动。


 

[下一页]


 

  A.暂时退出粒子视图,打开Create(创建)->Space Warps(空间弯曲),单击Drag按钮在场景中拖动,将这个空间弯曲命名为“减速_Drag”,进入修改面板设置其作用的时间和动画等长,X、Y、Z三个轴向的强度均设置为5%。

  B.回到粒子视图中,拖放一个Force运算符到事件“溅起水花_Event”中,放在Spawn 01测试下方,选择这个新建立的Force 01运算符,在右侧的属性面板中单击Add或者By List按钮选择空间弯曲。

  7)拖放一个Delete运算符到事件“溅起水花_Event”中,放在最下方,选择Delete 01,在右侧的属性面板中选择Remove(删除)方式为By Particle Age(按照粒子生命),设置Life Span(生命长度)为20左右。

  7、涟漪效果

  现在我们开始制作水面上的涟漪,显然形成涟漪的事件应当接受来自事件“粒子发射_Event”中的Collision测试的输出。制作涟漪效果可以使用Shape Mark运算符。

  1)在粒子视图中,从下方的运算符库中拖放一个Shape Mark运算符到上方视图的空白出,这样会自动建立一个新事件,将其命名为“激起涟漪_Event”。

  我们需要将事件“粒子发射_Event”的Collision测试的输出和事件“激起涟漪_Event”的Splash Mark运算符的输入连接起来。但是在前面的操作中我们已经将Collision输出指向事件“溅起水花_Event”了。所以还必须想办法“分流”出一部分粒子。

  2)从粒子视图下方的运算符库中拖放一个Split Amount测试到事件“溅起水花_Event”中,并放置在最顶端。


 

[下一页]


 

  3)将Split Amount的测试输出和事件“激起涟漪_Event”的输入连接起来。

  4)选择Shape Mark 01运算符,在右侧的参数面板中单击Contact Object按钮,然后在场景中单击选择水面物体(WaterSurface)。

  现在我们来理一下思路,在事件“粒子发射_Event”中粒子不断产生(由Rate、Speed等运算符控制产生的数量和速度),这些粒子经过Collision检测的测试,凡是和空间弯曲“水面_POmniFlect”发生碰撞的粒子都会被传递给事件“溅起水花_Event”,“溅起水花_Event”通过Split Amount运算符将一部分粒子交给事件“激起涟漪_Event”处理,在“激起涟漪_Event”中我们就要通过Shape Mark 01运算符来模拟水面的涟漪效果。

  5) 这时如果播放动画可以看到,当粒子碰到水面时,水面上会出现微小的多边形,但是面积太小,几乎看不见。打开Shape Mark 01的参数面板,在In World Space中设置Width和Length为较大的值,比如20左右。

  6)现在还有一个比较棘手的问题,那就是水花落到水面时出现的涟漪是逐渐扩大的,如何制作这种效果呢?我们可以使用Scale运算符。


 

[下一页]


 

  从下面的运算符库中拖放一个Scale运算符到Shape Mark 01运算符下方,注意位置不能放错,否则就失效了。选择这个新添加的Scale运算符,设置其Type(类型)为Relative First,Scale Factor(缩放指数)均为10%,Scale Variation(缩放变化)均为5%。

  7)打开Auto Key动画记录模式,将动画滑块拖动到60帧左右的位置,然后设置Scale Factor参数为100,这是你可以看到参数右边的调节按钮周围出现红色方框,这表明动画已经成功记录。现在播放动画就可以看到粒子碰到水面时的涟漪荡漾的效果了。

  8)还有最后一个问题,涟漪会一直飘在水面上,像浮萍一样,显然这也是不真实的。我们添加Age测试,它能够测试粒子进入事件后经历的时间长度,如果到了一定期限,我们就将其传递给另外一个事件。

  从运算符库中拖放一个Age Test测试到事件“激起涟漪_Event”中,放在最下面,设置其为Event Age,其他设置不必修改。

  9)拖放一个Delete运算符到视图中的空白区域,这样可以新建一个事件,将其命名为“删除涟漪_Event”。将事件“激起涟漪_Event”中Age Test测试的输出和事件“删除涟漪_Event”连接起来。


 

[下一页]


 

  8、随风飘散

  要想制作更加逼真的效果,风是必不可少的。具体来分析一下就是:喷嘴中飞出来的一部分水珠会被风吹成更小的水珠,这些小水珠的下落速度会变慢,并且会随着风飞舞。

  水珠破碎的效果显然可以用Spawn来实现,而小水珠的下落速度减慢以及随风飞舞的效果则应当使用Force运算符。

  1)在粒子视图中从下面的运算符库中拖放一个Force运算符到上面的视图中,注意不要放到其他事件内部,让系统自动建立一个新的事件,并将其改名为“随风飘散_Event”。

  选择事件“随风飘散_Event”内部的Force 03运算符,在右侧的属性面板中单击By List按钮将空间弯曲“下落_Gravity”加入其中,然后将Influence参数由1000减少到500。之所以进行这样的调整是因为,被风吹碎的小水珠下落速度应当减慢,因此减少重力空间弯曲的影响程度。

  2)再拖放一个Force运算符到事件“随风飘散_Event”内部,选择这个运算符,在其属性面板中将空间弯曲“风_Wind”添加过来。

  3)从运算符库中拖放一个Spawn运算符到事件“粒子发射_Event”中,放在Collision 01上面,将这个Spawn运算符的输出和上一步建立的事件“随风飘散_Event”的输入连接起来。

  4)这些随风飞舞的水花不会自动消失,而是一直在场景中飘,因此我们还需要为事件“随风飘散_Event”添加一个Delete运算符,设置其参数为By Particle Age。

      

  9、材质和渲染

  现在进入最后一个步骤,和非事件驱动粒子系统的使用方法一样,在对粒子流进行渲染之前也需要对粒子进行适当的设置。对于非事件驱动粒子系统而言,我们将粒子的类型设置为Facing就可以了,但是对于粒子流而言,我们仍然需要使用运算符。

  1)在粒子视图的运算符库中拖放一个Shape Facing运算符到事件“粒子发射_Event”内,然后对事件“溅起水花_Event”和“随风飘散_Event”执行同样的操作。如果嫌一个一个添加麻烦,可以使用运算符的复制粘贴功能来快速完成。


 

[下一页]


 

  2)现在设置材质,再为“粒子发射_Event”、“溅起水花_Event”、“随风飘散_Event”这三个事件添加一个Material Dynamic运算符,在这个运算符的属性面板中单击None按钮,从弹出的材质/贴图浏览器中选择一个水化材质(这个材质非产简单,其制作方法不再介绍了,你可以直接借用前面制作流水效果中使用的材质。)

  3)水中涟漪的材质和上面的略有不同,不过制作也很简单,只需要再Opacity贴图通道中贴入一个Gradient Ramp贴图,并设置其渐变方式为Radial,然后调整一下滑块就可以了。

  设置好材质之后同样为事件“激起涟漪E_Event”添加一个Material Dynamic运算符,并将刚才制作好的涟漪材质赋予这个运算符。

  至此,这个喷泉就已经基本制作完成了,不过还有很多地方值得完善。你可以再为事件“粒子发射_Event”、“随风飘散_Event”添加Scale运算符使其在运动过程中逐渐增大 ,重力和风力的强度还可以进行更细致的调整,再有就是为“粒子发射_Event”中的Birth和Speed参数添加Noise(噪波)运动控制器使粒子产生的速度和数量不至于一成不变而显得呆板。这些操作所使用的方法在上面的介绍或者以前的教程都已经做了细致介绍,因此不再一一展开。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 用户名: 密码:
  匿名发表
今日推荐
技术文库(共有 46294 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
移动开发
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail