Maya 刚体动力学特效-撞击破碎特效的完整流程 

2012-03-20 14:53 发布

2936 3 0
现在我们来弄一个比较复杂的刚体动力学特效。一个大铁球撞破墙壁,一辆路过的小轿车被碎石击中,然后变向(危险行为,请勿模仿)。1 M# @% M8 x  W
4 j  B# Z1 r5 g- \  W8 I( ^
! ]: H: C  @0 u9 ^1 D- f7 D3 e$ t
1.墙壁的创建。
0 u5 f& v& |5 H" X这里就不与BlastCode这样专业的破碎插件进行比较了,我使用Maya最平常的方法创建出即将破碎的墙壁。( \9 K3 x) ]9 N' B
Maya制作模型碎片的一些方法:
/ k( e/ y' j5 I6 L(1)使用CutFacesTool对模型进行直线切割。这种方法可以得到很规整的模型,尤其可以应用于复杂几何体的切割,不过缺点就是操作繁琐。
5 g  l% q( s; d; |! j/ X/ f(2)使用SplitPolygonTool在简单的平面上描绘出裂痕,然后使用提取面命令分离这些面(执行Extract命令前KeepFacesTogether要先去掉勾选)。
* L, _6 r) T1 D: c3 M7 Z# @
. ^- ?1 x$ y+ W* d3 J& q/ b* |( h+ |! F' ?3 j

5 d1 Z& [3 ?# q- ]$ M7 Q
5 h2 \% @/ ]( f) ~4 [& R! t# x
/ G5 q, B$ U: U! u1 e4 d(3)使用内核布料系统的布料切割,不过碎片会比较整齐。$ Y/ l, A9 _- U8 ~8 P
(4)使用Dynamics动力学模块下Effects菜单的Shatter。此命令要求模型无历史,且材质不能太复杂,在圆弧表面的几何体上容易发生形变。
- }6 C" y9 @9 y7 d/ e; r; K(5)使用SplitVertex切分点工具。此命令会将点周围的边全部分离,与布料的切割类似。
. z6 V0 S: b: |: s. Y7 h9 a* R7 M( g(6)使用自定义的色块贴图,执行贴图转几何体命令(TextureToGeometry),然后提取面分离。这是最省事的方法,可控性也高,不过太复杂的贴图Maya会需要大量的运算时间。与BlastCode插件的破碎贴图有点类似。$ i$ \' x* d# ^; ~
这里,我所进行的步骤如下:) G1 D/ F0 r1 F, S3 h
(1)使用CutFacesTool将面片切割为几大块;
. ]8 T4 Y+ Y8 R7 }$ j' v5 K 9 t3 Y1 j( v/ X

2 v9 J& U. s7 d  ^% }5 V(2)对撞击中心的区域模型进行细分操作:EditMesh->AddDivisions;  o$ X1 d; H2 Q4 v
0 d# y: ~3 l( L7 v( E# M
(3)删除所有碎片的历史,对细分后的碎片执行:Effects->CreateShatter(粉碎);
3 p% K# p" k8 O9 l ! a# F! N' S+ V

8 g7 n" N) v9 S/ R(4)全选整个墙体模型,执行Extrude(挤压)命令,制作出厚度;, F+ p& q1 g! M1 K4 Y
9 P5 |) j7 t1 h8 `8 ^* b/ i
& u# m+ f+ i0 u
(5)全选整个墙体模型,执行Combine(合并)命令,合并为一个物体以方便编辑UV;
) s9 U) ]% v$ W" r! P1 f
4 U  h5 j7 {8 p8 x  ?. I1 t7 n- e8 ?' l! H3 Y
(6)选择这个合并后的模型,使用一个平面的UV贴图投射PlanarMapping(如果也需要对模型的厚度进行单独UV展开,可以在侧视图选择这些模型面后进行AutomaticMapping);
4 q6 U. C6 O/ _2 }
/ J4 x) D: Y+ r# a5 P2 s7 d) z$ d# K  X' o  G, l: O
(7)选择模型,执行Separate(分离),再次将模型分离为独立的小块,然后删除所有历史。
% k5 }8 j: u' u. v* Q( Y
! U2 C& Y: L- u6 |3 v& V8 E4 |8 g1 J6 X
(8)除了删除操作历史,冻结坐标(FreezeTransformations)和轴心居中(CenterPivot)也是很重要的操作。如果你在执行刚体解算时发生异常(如碰撞后刚体方向,旋转或大小很不合理的变化),那么最大的可能就是刚体物体或者其所在的组的变形属性(位置,旋转,缩放)的初始态有数值变化。: j8 S( i2 j4 x2 g! `  B; A

* [4 L* U: R8 J4 p' X
3 t6 q( g+ X0 d4 {. F5 D(9)赋予模型贴图。与常规的模型贴图是一样的,没太多需要说明的,不过要注意的一点就是:由于是会产生动力学动画的物体,因此不可使用3D纹理节点进行贴图(谁用谁知道……)。$ H$ Q$ T2 p5 j  a$ q8 Z
. g5 X$ P8 p7 w' W& \2 q$ M
: p. }0 ]4 Y2 f$ m9 I* W" r

5 L8 P- Q4 u% `# w! }4 c8 I5 G* l2.其他场景物体。斜坡,地平面,小车,大铁球。
* z8 l$ X' r5 x: K  @; s' B
- c8 B" M. Q* y8 d1 G* B- {; A" p; |1 T3 D6 b/ R
3.制作包裹物体(刚体代理)。刚体的模拟是很耗费资源的,尤其是过于复杂的模型。配合分层渲染,我们应尽可能的优化刚体的解算。包裹物体就是参考复杂模型的基本外观,制作出一个简单的多边形几何体;将复杂模型作为包裹物体的子物体,然后在渲染的时候排除包裹物体(方法很多,最简单的就是将该包裹物体放于物体层中,设置层选项为Template参考模式-T字母标志;不过如果使用的是MentalRay渲染,就需要使用渲染过滤,因为MR不支持参考模式的层设置)。4 F! X$ W* Q* E! t# {# B
+ L/ H. ?* E" l  z

) q8 @/ @( C; W4 g4.赋予包裹物体刚体属性。' P- x. S: I; s; A
6 Q/ d& R5 `0 h, c+ m% H
& `5 J# y5 j: U9 G  p
包裹物体刚体属性参数设置如下:
: a& ?& I* R! N) A! ~InitialVelocityZ(Z轴向的初速度):-20(负号表示朝Z轴的相反方向运动)& B1 m9 {, ^2 V4 H
ImpulseZ(Z轴向的推力):-10(抵消部分总摩擦力)
% \* }3 i1 O. c& ?2 x. SMass(质量):500" u  s1 R' o7 P8 n- J+ T2 h# z; M
Bounciness(弹性):0.3
/ H' z9 N  n* @2 J
9 H6 r$ `5 w7 U5.动力场连接。选择车的包裹物体,执行Fields->Gravity,将重力场增加至刚体解算中。
! I6 Y/ S9 o& n- E7 y9 E6 F9 j * h, o( E' X" S. f' t1 m$ ^' L* ^
3 _4 f2 S2 g) c7 x, O" U* }
6.对地面创建被动刚体。
' o# ^' C5 x  Q! J) e5 ?8 R % _! g0 n1 m4 ^0 l/ i
- q  x% g0 s% U# s1 ?7 U9 T: d
7.刚体约束。选择墙壁后的球体,执行CreateNailConstraint(创建钉子约束)。创建约束或动力场连接时,Maya会自动将几何体转为刚体属性,所以可以跳过赋予刚体属性的步骤。
! r& u4 K$ x0 s/ n球体刚体属性参数设置如下:# O! ]  ?$ v8 N7 `
Mass(质量):10007 M1 P# q* @4 F* e$ f
Bounciness(弹性):0.1
* P7 ], N# p; j' P9 z' }1 v8 A 0 L. N% x) y5 \) j; k/ G* S9 n
3 K. u8 V* C+ H9 G; H3 ?
8.设定初始位置。可以使用风场将球体吹至一定高度后,再将此位置的球体设置为初始态InitialState;这里我使用一个NURBS曲线圆圈进行定位,直接移动球体的位置(钉子约束点位置不变)。
# @2 _& T- a0 X, R
; r% u' l, U( j& E6 P0 t' O( U9 Z$ \2 b+ ^# n4 u
9.手动将刚体与场景中已存在的动力场进行连接。选择球体,执行Window->RelationshipEditors->DynamicRelationships(动力学关系编辑器),点击Fields栏下的GravityField,当文字背景为默认的橙色时表示所选物体已经受重力场的影响。
$ n- L5 G3 Y( _! Z" e; N # S+ t8 U% \- T+ ^7 N3 e
      
6 W. I% T0 f& _7 s' e  Z
9 P" t4 n& _6 ~. f" C
6 S- C2 j! P" U& H: E10. 测试场景。为使小球穿过墙体撞击小车,根据需要改变小车的初速度或推力。因为总摩擦力与小车的质量有关,因此初速度的能量消耗程度取决于物体质量和摩擦因数的大小。5 B7 U8 a! B, M4 K! I0 P7 }9 I

4 s) ]5 |, j8 s4 `/ k! E
9 G9 |" m2 L% q4 D; @7 S+ k11.墙壁刚体的制作――由于墙壁有较多的碎片小块,因此我将它留到最后再制作。全选墙壁物体,执行CreateActiveRigidBody。此时最好不要播放场景动画,因为基本上都会卡机,甚至Maya崩溃。
1 O, y$ E7 N' c0 Z+ C; l7 l* ^: r解决方案(任选其一):; R, e* H9 C% j. c+ [
(1)缩小所有刚体,使它们之间具有一定间隔,并修改刚体解算器下的参数值-步长和碰撞容差。& e- |; V  z( I
(2)设置刚体代理-方体和球体,降低解算质量。
( p8 k7 q2 X* Q) l0 D; \2 n(3)设置碰撞层。
/ P+ t& Y' `9 B6 x" G(4)设置穿插属性。* [3 @# \$ J  H  c
如果撞击发生在很短的一瞬间,且镜头上不会过多的停留在碎片的飞行中,那么可以使用方案(4),这是快速实现效果的最优选择;/ ]) X- Y. O' K; u" M1 k/ r
如果镜头不会停留在撞击点上(或者距离较远,可以忽略模型块的间距),我们可以使用方案(1),这可以较为完美的实现碎片飞行中的碰撞;$ w) R! {1 t; |1 }
如果碎片较为规则,接近于方体,可使用方案(2)刚体代理来完成;0 C; I4 D, T) }9 u+ C, `- I$ q
如果你需要对不同区域的碎片进行碰撞设置,方案(3)则可以考虑,我们可以将之理解为方案(4)的扩展。
; x& h* J. v+ H! P有时由于一些画面视觉的要求,我们需要同时将多种方案应用于一个场景动画中,但往往还是难以达到理想的动力学解算效果。此时,我们可以对个别物体的烘焙关键帧进行细节动画的调整;如果工作量太大,对碎片进行分层渲染来避免穿插镜头也是可以考虑的。
5 c8 L9 w" M  F: ?( @6 x" ~
) k0 E# Y( B% b8 y/ _! q+ t2 W12.选择方案(4)进行。一般撞击后飞行的碎片之间的碰撞不会太多,这里我直接忽略(谁叫我使用的是一个过时了的笔记本……效率优先),遇到穿插时我更倾向于对烘焙了关键帧的物体进行个别处理。
% q. D; ?" I  g; U( g(1)全选墙壁的各刚体几何体,执行CreateActiveRigidBody;6 r" \- T/ D( Y6 `8 j: X

4 {# B( s, p& ~" K
' t1 {+ ?2 v, s8 v* }" V) `(2)保持刚体全选,点击右边通道栏SHAPES下的RigidBody节点,展开属性列表,直接修改参数值如下(所有选择物体的相同属性都会被同时修改):$ R, T" I$ P2 ~
Mass(质量):200 ?+ d; l6 q1 Z# Q. V, V9 L
Bounciness(弹性):0.1! R, b# l1 x/ b9 P% `; T
StandIn(替代):Cube(为了正确解算,最后我还是设为了None)2 X; _+ y5 M7 F" Y$ h
5 O. C6 w' a7 w3 Y1 t# t' v. J. c0 ^

: B9 G! I( i- |7 m2 S6 Y6 H(3)保持刚体全选,执行Solvers->SetRigidBodyInterpenetration(设置刚体穿插);
9 G, p- q1 @! ^3 r ! @% c. q$ |: ]# |
# I3 E. |' G0 Z& [
(4)选择最下面的几何体,将通道栏中的Active改为Off(输入0,回车即可)。. J# {8 G/ ]4 u  L
因为底部几何体不参与动力学解算,此步操作将所选几何体变为被动刚体,可避免它们与被动刚体地面的穿插(或者你也可以将它们与地面设置刚体穿插)-被动刚体间不会出现解算穿插的问题。, @5 b8 N7 R7 n; j6 ^0 j0 v
$ b9 _4 p$ e  Q8 K6 ~

- i# \5 W+ [( ]# u1 f/ e(5)设置了刚体间的穿插,可以获得流畅的动力学解算效果,并且除了刚体碎片间的碰撞,它们与场景中其他刚体的碰撞还是会被真实的解算出来。如果仍打算将解算质量降到最低来提高解算速度,可以将所选刚体的通道栏的StandIn设置为Cube,并将刚体解算器RigidSolver节点的StepSize(步长)和CollisionTolerance(碰撞容差)数值提高,而RigidSolverMethods设置为MidPoint。
% Q% f: m0 D. T, K  r / L/ D- n+ R8 B+ S+ i) q8 }3 F% w
3 u7 K$ B) u) ]% o# C, c' b
(6)播放场景动画进行测试。当动画达到预想效果,对墙体刚体设置重力场。
9 b  u8 n2 `/ Z7 I$ G+ b3 v0 s 7 g0 K! W9 l6 u: q' d2 x8 o

9 j% O5 M. o: B4 e9 I9 U: p在碎片被撞击飞出之前,我不打算让它受到重力场的作用而运动,因此我需要加入一个新的重力场,并对力场设置关键帧:将重力场的Magnitude(强度)设置为0;在发生撞击的那一帧设置关键帧(KeySelected),然后在下一帧更改Magnitude数值为9.8并设置关键帧。5 u" U5 x% ~2 `' @) j

2 d& u. q  D# D2 I: z& k! d6 }" S, X5 @, @) S! X  H( V& W
6 ~& L, z1 x$ I# i. k
9 f0 Y3 l" H8 n; f* @2 |& k
3 n% _+ s5 K# E
(7)选择那些不打算参与解算的模型,将它们通道栏的Ignore设置为On。, Y% H3 a! a- H( x" F

+ O/ N8 |- `% |  f" m$ ]$ n5 n( `+ _: V# f* B  z* Q1 E# f# Z$ A
(8)播放动画,发现碰撞区的一些碎片与剩余的墙体发生穿插。
$ ]* }: P7 r+ _& }
7 z# p1 s; n+ U9 b6 g$ N% z
2 g5 Y3 ~; g+ W$ p! l5 z) M4 t+ O! H+ E
# Y5 X, m8 f  ~, M- z+ m3 V, N8 K要解决这个问题,可以选择这些刚体,恢复它们的碰撞属性(SetRigidBodyCollision)――如果恢复的刚体太多,那又回到了设置穿插属性之前;根据镜头需要,常常需要进行分层渲染或调节烘焙关键帧来解决物体穿帮的镜头(华丽的特效是要慢慢磨出来的)。
* U6 {( [; N8 i: F
, L# Z1 p; b1 C* t0 w3 ?' `2 Z. N$ t+ A  j' l0 `! {
(9)当动画效果基本达到,烘焙动力学模拟的关键帧(BakeSimulation),然后删除所有刚体属性。! G; E( O5 R% s
*国际惯例,将关键帧的总长度压缩为一半左右。) m4 o( o& a. [& ?, O- X. E

$ Z6 f& A6 L3 l' v" }* S  D9 `9 {7 z% t" r
/ t9 F: J2 K4 k
13.设置镜头及灯光,渲染。当加入一些粒子特效(3D粒子或平面粒子)及碎片飞行的运动模糊,并在后期合成中完成震镜效果,一个很酷的撞击特效也就产生了。以下使用平面粒子软件ParticleIllusion素材中的一个简单烟效进行合成的效果演示。6 _# r. R* o6 T6 \; U: N

. N7 Q! p" B# D. N
$ k$ R1 ?1 F- \5 ~7 S, u      
+ L7 T  I6 g* h! b14.最终效果(太大图片网络观看会比较卡,因此设置为低质量的GIF图片)。* y4 W3 _3 ^2 M; |3 W
; A! Q; p% H! A. e6 ~
5 |+ @% O. s8 V. P6 M' N- ~0 y& n
15.技术点总结:# Q8 p( J/ a+ r: D5 z# x1 C0 {$ u
切割物体-设置刚体属性-添加力场和碰撞-设置刚体穿插-烘焙动力学关键帧
! U4 h: k  d  r) d. P7 T3 P& B
8 Q4 ]+ r( x$ X  Z

! n; G5 Z% {" V$ @3 @

评分

参与人数 1金币 +18 收起 理由
δ弥κ留 + 18 很给力!

查看全部评分

B Color Smilies

全部评论3

你可能喜欢

Maya 刚体动力学特效-撞击破碎特效的完整流程 
联系
我们
快速回复 返回顶部 返回列表