☰
Maya粒子实战:玻璃水滴垂落特效制作全流程解析
2026/10/31 7:41:10 网站建设 项目流程

做玻璃上水滴垂落这个效果,是我早年在测试Maya粒子系统时候反复折腾过的一个案例。那时候只是想做一个“水珠顺着玻璃滑下来”的画面,结果发现事情远没有想象中简单,背后牵涉到粒子发射、碰撞解算、材质渲染一条完整的Maya FX流程。这个案例看着小而美,实际上把Maya里最常用的几个动力学模块全串起来了,非常适合拿来练手,也是很多特效岗位面试时喜欢出的题目。

这个效果的核心诉求很明确:玻璃表面凝聚水珠,水珠逐渐变大,受重力影响向下滑动,滑到一定位置后脱离表面滴落。整个过程中最关键的是水珠“粘在玻璃上往下流”的状态,如果调不好,要么水珠直接弹飞,要么黏在玻璃上一动不动,非常尴尬。我会把整个制作流程拆成场景搭建、粒子动力学、材质渲染、问题排查四个部分来讲,顺便分享一些我在实际项目中踩过的坑。

1. 效果拆解与思路选型:为什么用粒子而不是流体

1.1 水滴垂落的物理逻辑到底是什么

想让水珠动得自然,首先得搞清楚水珠在玻璃上经历了哪几个阶段。第一阶段是凝结,水汽在玻璃表面聚集成小水珠,这个阶段水珠是静止的;第二阶段是合并与增长,小水珠越聚越大,表面张力撑不住重力分量,开始缓慢向下滑动;第三阶段是滑落加速,水珠一边滑一边继续吸收沿途的小水珠,速度明显加快;最后一个阶段是脱离,水珠滑到玻璃边缘或者因为自身重量超过表面附着力,直接掉下去。

如果你直接用Maya流体去模拟这个效果,也能做,但是成本太高。流体解算动辄几百万个粒子,对机器要求很高,而且这种“附着在表面缓慢滑动”的状态用流体模拟反而很难控制,稍微调不好就变成瀑布或者水花四溅。粒子的思路就轻巧很多:每个水珠就是一个粒子或者一小组粒子,用碰撞让粒子留在玻璃表面,用重力场让粒子慢慢往下滑,配合粒子生命值控制滑落距离,最后把粒子替换成水滴模型或者以球体渲染。这套方案可控性极强,渲染速度也快得多。

1.2 粒子方案与流体方案的取舍对比

我在实际项目里两种方案都用过,这里做一个简单的对比,方便大家选型。

流体模拟的好处是水体的连续性强,水珠之间的融合、断裂都非常自然。但缺点也很明显,解算时间太长,调参周期以天为单位,对场景面数、容器大小都很敏感。做“玻璃上的一排水珠同时下落”这类效果时,流体甚至不一定比粒子更好看,因为每个水珠形态太规整,流体反而容易细节过载。

粒子方案虽然每个“水滴”的融合效果需要想办法模拟,但胜在轻量、直观、好调。你可以非常精确地控制有几个水珠、什么时候开始下滑、下滑到哪个位置消失。尤其是做产品广告这种需要反复迭代的项目,粒子方案的灵活度是碾压性的。所以我的建议是:如果是单个玻璃板上的水滴垂落,优先用粒子;如果要做一大片水流在玻璃上冲下来,那种连续液面效果才考虑流体。

1.3 Maya FX的标准工作流拆解

无论用什么方案,Maya特效的标准工作流都逃不开几个环节:先建立场景和碰撞体,然后发射粒子,再用场来控制粒子运动,接着调节粒子属性和碰撞参数,最后赋予材质和渲染。这个案例也一样,我会按这个顺序一步步展开。

很多新手拿到这个案例第一反应是:直接给玻璃板加个重力场,让粒子从上方掉落,粒子碰到玻璃板就会弹开。这样做确实能看到粒子下落,但永远不会出现“水珠在玻璃上滑动”的效果,因为默认碰撞的弹性太高了,粒子一碰就弹走。所以这个案例里真正难的点不在于“让粒子掉下来”,而在于“让粒子听话地粘在玻璃上缓缓滑动”。

2. 场景搭建与碰撞准备:稳扎稳打才能不返工

2.1 玻璃模型与碰撞体的构建要点

场景搭建看起来很简单,就是一块玻璃板加一个发射器,但这里面有几个细节直接决定了后面会不会翻车。

玻璃板本身不应该只是一个平面,最好给它一点厚度。原因很简单,Maya的碰撞计算依赖于多边形面,一个纯平面在粒子快速运动时很容易发生穿透,尤其是粒子垂直于表面冲过来的时候。我会用圆柱体压扁或者直接做一个很薄的立方体,让玻璃板在垂直方向上有高度,这样粒子接触到玻璃上表面时有一个明确的面可以做碰撞。

碰撞体的历史记录一定要清干净。如果你给玻璃板加了细分或者平滑,在粒子碰撞前先把这些修改冻结掉,最好直接复制一份模型当作碰撞体,不参与渲染。这样做的好处是两个:一是碰撞计算更快,二是你可以给渲染模型更高的细分级别,碰撞体保持低模,两者互不干扰。

给粒子加碰撞也很简单,选中粒子shape节点,在属性编辑器里找到geoConnector,点一下“Create”然后拾取玻璃板模型。这里有一个我吃过亏的地方:如果玻璃板模型有位移动画,一定要把“Use Background”之类的选项关掉,否则碰撞体不会跟着模型运动,粒子会从玻璃板中间穿过去。

2.2 粒子发射器的两种策略:凝聚初态 vs 直接喷洒

这是这个案例里最容易纠结的地方,发射器放在哪、粒子怎么生成,决定了水珠的初始形态。

第一种策略是“凝结初态”。水珠不是凭空出现的,而是在玻璃表面上逐渐凝结出来的。实现方式是发射器放在玻璃板正上方非常近的位置,大概距离表面0.05个单位,发射方向指向玻璃板,粒子以很小的速度落到玻璃表面,通过碰撞停下来,然后开始受到重力影响缓慢滑动。这种做法的优点是初始状态非常真实,你能看到水珠一颗一颗出现在玻璃上,适合表现“潮湿的玻璃逐渐凝出水珠”的过程。

第二种策略是“直接喷洒”。发射器放在玻璃板正上方,粒子以有一定初始速度的状态朝玻璃板喷下去,落地后碰撞停住,再开始滑动。这种做法效率更高,粒子更快进入“滑动”状态,但初始的“凝结”过程就省掉了,适合比较快速的镜头。

我个人做这个案例时用的是介于两者之间的办法:发射器在玻璃上方,速度设为0.2到0.8之间的随机值,让粒子轻轻落在玻璃表面,碰撞后不会弹跳,直接进入滑动状态。然后把发射器的发射速率调成阶梯状,一开始密集出粒子,形成几个明显的大水珠区域,后面慢慢减少发射,模拟水珠合并之后的稀疏分布。

2.3 让碰撞“粘得住”而不“弹飞”的关键参数

粒子碰撞有一个默认问题:弹性太大。默认情况下碰撞弹性resilience是0.1到0.5之间,水珠砸在玻璃上会弹一下。但这个案例里水珠应该是轻柔地“落”在玻璃上,然后立刻粘住,所以要把resilience压到0.02左右,几乎不弹跳。

Friction(摩擦力)也要调高,但是不能太高。太低了水珠会直接滑到玻璃边缘掉下去,太高了水珠完全不动。我的经验值是0.4到0.8。想模拟比较脏的玻璃,摩擦力就大一点,想模拟干净的湿润玻璃,摩擦力可以稍微小一些。这个数值没有绝对标准,完全取决于你想要的水珠下滑速度。

还有一个经常被忽略的参数是碰撞容差和最小碰撞速度。粒子速度太快的时候,即使有碰撞也可能穿透。所以我一般会把粒子的初始速度控制在2以内,宁可慢慢落到玻璃上,也不要高速喷射再指望碰撞能兜住。有一次我图省事,初始速度设成5,结果粒子全部穿模到玻璃板下面去了,排查了半天才发现是速度太高,碰撞解算跟不上。

3. 粒子动力学与调参过程:让水珠滑出节奏感

3.1 重力场、噪声场与滑动节奏的控制

粒子在玻璃板上停稳之后,接下来就是要让它产生“顺着玻璃往下流”的运动。这个运动主要靠重力场来驱动。

默认的重力场强度是-980(cm/s²),这个值直接套用到粒子系统上,滑落速度会偏快。我会把重力场的强度调小一些,比如-300到-600之间,然后观察滑落效果。调重力强度的时候要注意一个细节:重力场的-magnitude是矢量方向,默认沿Y轴向下,如果玻璃板是倾斜的,需要确保重力方向是“世界空间向下”而不是“沿玻璃表面向下”,这样粒子才会在玻璃表面产生一个沿坡向下的分力。

光靠均匀重力场会让所有水珠同步滑动,缺乏层次感。所以我会额外加一个噪声场,强度很低,大约为重力的十分之一左右,频率稍微高一点,给每个粒子一个随机的扰动,让不同位置的水珠出现错峰滑动的节奏感。这一步是让画面“活”起来的关键。

3.2 粒子生命值与消亡控制:避免水珠无限堆叠

粒子如果没有生命值,会无限积累下去,玻璃下方的粒子越来越多,渲染负担越来越大,画面也会越来越乱。所以必须给粒子设置生命值,让它在完成“滴落”这个动作后消失。

在粒子shape的lifespanPP属性里用一个渐变ramp来控制。ramp的横轴是粒子年龄,纵轴是生命值。我通常设置粒子从出生到消亡大概2到3秒,但是通过ramp让它在最后0.5秒内快速衰减。衰减的方式可以是先保持不透明,然后在最后阶段让半径迅速缩小,模拟水滴拉长后断裂消失的状态。

粒子半径也可以用radiusPP属性控制,给每个粒子一个随机半径,范围在0.02到0.08之间。如果想让粒子在滑动过程中逐渐变大,可以用ramp随着粒子年龄增长把半径放大1.5倍左右,模拟水珠汇聚变大的效果。

3.3 水珠“一滴滴垂下”的节奏编辑技巧

这个案例的镜头感很大程度取决于水珠下落的节奏。太多粒子同时滑落会显得像漏水,太少又会显得空洞。我的做法是把发射过程分成几个阶段:前1秒集中发射20到30个粒子,模拟凝结;中间2秒发射频率降低到每秒5个,让水珠之间拉开距离;最后彻底停止发射,让现有的粒子全部滑完消失。

另外一个实用技巧是把整个粒子系统复制两份,一份作为“前景层”,粒子稍微靠近镜头,半径稍微大一点;另一份作为“背景层”,粒子稍微远离,半径小一些。两层同时滑动时,前后错落,空间感和层次感会强很多,渲染出来质感完全不一样。

3.4 万向节问题在粒子朝向中的应用提醒

搜索热词里有一个“Maya怎么调万向”,这里顺便说一句。水珠在滑动过程中如果做了变形或者旋转,很容易碰上万向节死锁问题。比如你想让水珠在滑落时轻微翻滚,直接用旋转属性去调,有时候会发现旋转到某个角度后突然变得很奇怪,这就是欧拉角的万向锁。

我的建议是:不要让水珠大量使用旋转属性,而是用目标约束或者让模型始终朝向运动方向。如果非要旋转不可,可以切换旋转顺序试试,或者在运动轨迹上直接用手K的旋转帧去控制,而不是依赖表达式。这个坑在绑定领域更常见,但粒子替换模型的时候同样会遇到。

4. 渲染与材质表现:让水珠有“晶莹剔透”的质感

4.1 粒子渲染方式选型:球体渲染 vs Instancer替换

到了渲染阶段,第一个要决定的是粒子以什么形态出现在画面里。最直接的方式是让粒子自身以球体形式渲染,Maya里把粒子renderType改成spheres,然后给radiusPP指定半径。这种方式的优点是快、简单,缺点也很明显:所有水珠都是完美的球体,没有拉长变形的效果,看着不够自然。

更推荐的方式是Instancer替换。我预先做一个水滴模型,这个模型不用太复杂,一个细分球体在Y轴方向上稍微拉伸,顶部稍微收窄,就是一个很标准的水滴形状。然后用Instancer把水滴模型实例化到粒子上,粒子运动到哪,水滴模型就跟到哪。Instancer的额外好处是可以单独控制每个实例的缩放和朝向,粒子在下滑时可以把水滴拉得更长。

用Instancer时要注意一个坑:粒子的位置会影响实例的位置,但如果粒子在GLB或者GLTF资产流通的环境下工作,实例化节点的数据导出可能会出问题。我通常直接选择Maya原生的ShadingEngine和Arnold渲染,不用考虑跨软件流通,这样最稳定。

4.2 玻璃与水珠的材质参数设置

水珠的材质核心是折射和反射。属性就是Arnold的aiStandardSurface,关键参数是折射率IOR,水的折射率是1.33,玻璃是1.5。这两个数值不要搞混,玻璃的折射率比水高,所以两者放在一起时,玻璃会更“厚重”一些。

水珠的transmission weight要开到接近1,这样光线才能穿透水珠。粗糙度要非常低,大概0到0.05之间,水珠表面接近镜面反射。高光强度不要拉太高,否则会变成塑料珠子。

玻璃材质这边,transmission weight也接近1,但可以把specular roughness稍微提高一点,模拟磨砂或者脏玻璃的感觉。背景最好放一个深色或者黑色的环境,特别能突出水珠的通透感。灯光我用的是一个HDR环境贴图作为主光,然后补一盏柔和的区域光从侧面打过来,让水珠边缘出现一条细细的亮边,就是那种“水珠边缘发亮”的效果。

4.3 渲染采样的经验值:平衡速度与质量

Arnold渲染水珠时,最容易出现的问题就是折射产生的噪点。水珠和玻璃叠加在一起时,光线路径非常复杂,采样不够就会布满颗粒。我的做法是把Arnold的AA采样开到3到5,其他的diffuse和specular采样可以保持在2到3,透明折射相关的transmission采样单独开到8以上,这样能显著降低水珠边缘的噪点,而渲染速度又不会爆炸。

给水珠加一点透明度贴图不是必需的,但可以在材质里加一层薄薄的coat层,让水珠表面多一层湿润感。水滴真正的魅力在于它能反映周围环境,所以确保场景里至少有两三个可见的光源反射物,哪怕只是几个白色面板,水珠表面才会看到漂亮的反射图案,而不是死黑一片。

4.4 广告级效果的灯光布设经验

这种水滴玻璃镜头在广告里经常出现,通常是拍香水、护肤品或者饮料的广告。广告级效果和普通三维效果最大的区别在于影棚感。我的做法是在水珠后方放一个渐变背景板,光线从冷色调背景中透过来,水珠会呈现非常通透的蓝色调;然后用一盏柔光箱从正面45度方向打过来,在水珠正前方形成高光;最后在侧面加一盏轮廓光,把水珠侧边的折射亮边勾勒出来。

这种布光方式配合深色背景尤其好看,因为水珠是半透明的,深色背景会衬托出水珠内部的折射细节,每一滴水珠都像一颗小透镜。记得背景不要用纯黑,稍微带一点冷灰渐变,会让画面更有层次感。

5. 常见问题排查与进阶技巧实录

5.1 粒子乱飞、穿模、不滑动等四大典型问题

做这个案例过程中最容易遇到四类问题,我整理成一个速查表,方便大家对照排查。

粒子穿过玻璃板直接掉下去,最可能的原因是碰撞体没有正确连接,或者粒子速度太快、碰撞容差太小。先检查geoConnector是否成功创建,然后把粒子初始速度降低到2以内,再把碰撞容差调大一点,一般就能解决。

粒子碰到玻璃后弹飞了,这是resilience太高的典型症状。把resilience降到0.02,同时把friction提高到0.5以上。粒子弹跳还有一个冷门原因:碰撞体的法线方向反了,检查一下玻璃模型的法线是否朝上,法线反了碰撞计算也会异常。

粒子停在玻璃上一动不动,怎么调重力都没用,这说明摩擦力太高或者粒子已经进入了休眠状态。把friction降到0.4左右,并检查粒子shape节点里是不是不小心加上了“Sleep”相关设置。如果粒子还是不动,可以先关掉所有场,只保留重力,看粒子能不能正常下落。

粒子在玻璃上滑动但形态太假,所有水珠都是圆的,没有变形的过程。这需要从渲染层面解决,我推荐的做法是给水滴模型做一个简单的blendShape,一个球体和一个拉长的水滴模型之间做融合,然后用Instancer根据粒子速度控制blendShape的权重。速度快的时候水滴拉长,速度慢的时候恢复球形,这样效果会非常生动。

5.2 水珠“断线”下落的实现技巧

水珠滴落时应该有一个“拉长—断裂—掉落”的过程,纯粹用粒子模拟这个效果可操作的方式有两种。

第一种是后期合成法,渲染时单独渲染一版只包含水珠的AOV,然后在合成软件里对水珠做拉伸和模糊处理,模拟水滴坠落的瞬间。这个方法最灵活,也最容易出效果,适合有后期环节的流水线。

第二种是纯三维法,让粒子在下落过程中切换成细长的圆柱体模型,通过Instancer的scale控制让它在Y轴方向拉长。但这种方法很难模拟液体表面的张力变化,我做下来觉得效果不如第一种。所以如果不是特别追求实时预览,我建议走后期路线。

5.3 与外部工具的资产往返注意事项

这个案例做完之后,经常需要把水珠效果和其他软件协作。比如把水珠模型导出给UE或者Blender做合成,这时候文件格式的选择就非常关键了。粒子缓存导出,我首推Alembic格式,它能稳定保存粒子位置、属性、实例化信息,Maya导出、外部软件导入之后基本不会丢数据。

GLB和GLTF格式在近两年的项目协作里也经常被问到,但说实话,这种格式更适合静态场景、材质烘焙、轻量化Web 3D的场景展示,不太适合粒子特效这种大量动态数据的传递。如果你一定要用GLB传输水滴模型,我的建议是:先在Maya里把模型用FBX导出去,再用外部转换工具转成GLB,这样更稳定。直接Maya导出GLB经常会有UV和材质丢失的问题,我踩过好几次坑。

5.4 一个提高迭代效率的实用技巧

做这种粒子特效,最怕的就是渲染到一半发现参数不对,全部返工。我习惯在调参阶段把粒子渲染方式设为“球体渲染”,用极小半径的粒子快速预览整体节奏,等节奏满意了再切换成Instancer替换模型看最终效果。这样能省掉至少一半的调参时间。

另外一个很有效的方法是分层渲染。玻璃板一个层,水珠一个层,背景一个层,分开渲染。这样如果水珠的问题需要修改,可以只重新渲染水珠层,玻璃和背景都能复用。特别是在多个镜头共享同一块玻璃背景的情况下,这个习惯能大幅缩短项目周期。

5.5 从单一效果到完整镜头的扩展思路

当你能稳定做出一块玻璃上的水滴垂落后,可以往很多方向扩展。比如把玻璃板换成弧形,模拟汽车玻璃上的雨珠;或者把场景扩展成室内窗户,配合室外的灯光做氛围感;还可以把水滴换成其他液体,比如油、酒、糖浆,只要调整折射率和摩擦力。

我去年接了一个护肤品的广告项目,前期测试就是拿这个案例去跟导演沟通水珠质感的。后来导演要求水珠里隐约能看见背景的花朵透过折射出来的效果,我当时直接把环境贴图换成了一张花瓣特写,水珠内部的折射一下就出现了花瓣形状,不用额外建模,效果出奇的好。这个经验让我明白,水珠材质看起来复杂,其实核心就是折射和反射的平衡,环境贴图用好了比堆建筑建模管用得多。

这个案例虽然小,但它把Maya FX中最经典的动力学、碰撞、场、实例化、材质渲染全部串了起来。我到现在做项目还经常回看这些基础参数的逻辑,很多大场景特效的核心思路都是从这种小案例里长出来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询