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

2012-03-20 14:53 发布

2935 3 0
现在我们来弄一个比较复杂的刚体动力学特效。一个大铁球撞破墙壁,一辆路过的小轿车被碎石击中,然后变向(危险行为,请勿模仿)。
2 ^1 H; x6 A3 W7 P . E; y- s% e4 }. R
3 D$ b- _% @" k; H* [+ g
1.墙壁的创建。
. I2 E5 |% a( @  O% x这里就不与BlastCode这样专业的破碎插件进行比较了,我使用Maya最平常的方法创建出即将破碎的墙壁。
& Q0 b0 @; f$ G$ s3 X5 t; |! uMaya制作模型碎片的一些方法:1 K/ `! B; S2 ]+ q  E+ P
(1)使用CutFacesTool对模型进行直线切割。这种方法可以得到很规整的模型,尤其可以应用于复杂几何体的切割,不过缺点就是操作繁琐。2 e  q5 R6 f: S8 y! m; ?4 _
(2)使用SplitPolygonTool在简单的平面上描绘出裂痕,然后使用提取面命令分离这些面(执行Extract命令前KeepFacesTogether要先去掉勾选)。, R! _4 G0 J, U% a( U& H: J0 \
* L9 u* G0 p5 D, ~

6 N  ~3 y% v9 G" E- N4 D9 x$ D
0 i' {# d. J# N  c4 i
4 K0 ], S: u; |, p/ [3 O$ x) Q# f" @4 Z) X, F
(3)使用内核布料系统的布料切割,不过碎片会比较整齐。
- R* O* ^  c, c" Y4 n3 I" |(4)使用Dynamics动力学模块下Effects菜单的Shatter。此命令要求模型无历史,且材质不能太复杂,在圆弧表面的几何体上容易发生形变。$ P" j) F* a; W
(5)使用SplitVertex切分点工具。此命令会将点周围的边全部分离,与布料的切割类似。
/ k4 z( t# k/ {# @4 O8 f* B(6)使用自定义的色块贴图,执行贴图转几何体命令(TextureToGeometry),然后提取面分离。这是最省事的方法,可控性也高,不过太复杂的贴图Maya会需要大量的运算时间。与BlastCode插件的破碎贴图有点类似。
6 T* p8 n' t8 T) r& ]这里,我所进行的步骤如下:
- w' f; `5 ]6 m" Q(1)使用CutFacesTool将面片切割为几大块;1 S1 r4 j' b  y7 ~* I
8 m) J- T7 a. v& X& t# j% @7 c

$ a4 ]' s/ G: M+ E(2)对撞击中心的区域模型进行细分操作:EditMesh->AddDivisions;( p( Y5 X; R0 l8 b4 A. s5 T
* U! P* Y% h9 x
(3)删除所有碎片的历史,对细分后的碎片执行:Effects->CreateShatter(粉碎);/ R& I2 q1 A/ T
2 [" r  I! [5 @) W
) `( @' x2 n. K9 L- _
(4)全选整个墙体模型,执行Extrude(挤压)命令,制作出厚度;, t+ h: H; V5 X0 P$ h' E. O( k& y
. A, Y) S* e: n- v

/ a" m6 x$ J8 Z* Q0 [(5)全选整个墙体模型,执行Combine(合并)命令,合并为一个物体以方便编辑UV;. n) D6 Z+ G" n5 d' k0 W5 S( L
  k! y/ ~2 S/ G$ b8 a1 @" x

/ |$ L' R$ Z# t# w(6)选择这个合并后的模型,使用一个平面的UV贴图投射PlanarMapping(如果也需要对模型的厚度进行单独UV展开,可以在侧视图选择这些模型面后进行AutomaticMapping);' n5 F& z* {$ y4 b4 r

6 {: s& _6 S6 I1 V) m9 y7 {1 k, k6 X! F2 z$ d/ M- i
(7)选择模型,执行Separate(分离),再次将模型分离为独立的小块,然后删除所有历史。
' h5 T( P$ n+ S7 P/ u1 _0 f& I 4 k- p3 }, T" z% m9 ^

) D% c- n5 u" F/ Y( H3 e0 Y(8)除了删除操作历史,冻结坐标(FreezeTransformations)和轴心居中(CenterPivot)也是很重要的操作。如果你在执行刚体解算时发生异常(如碰撞后刚体方向,旋转或大小很不合理的变化),那么最大的可能就是刚体物体或者其所在的组的变形属性(位置,旋转,缩放)的初始态有数值变化。
* |" u5 d& @+ Q6 z9 q% c/ p. s
' Q3 t. r! q1 ~
) C# m; p4 d+ _. e, [(9)赋予模型贴图。与常规的模型贴图是一样的,没太多需要说明的,不过要注意的一点就是:由于是会产生动力学动画的物体,因此不可使用3D纹理节点进行贴图(谁用谁知道……)。" d, H) c  O8 ~9 ]  [  h

6 m3 ^3 x5 `+ i5 c7 m
4 r) ?. E9 s: E7 j2 |4 I; \: a4 G
2.其他场景物体。斜坡,地平面,小车,大铁球。
' k; c0 f/ `+ l  o
, \9 }# g7 J4 O4 T
4 Q& P1 e% ~0 M3.制作包裹物体(刚体代理)。刚体的模拟是很耗费资源的,尤其是过于复杂的模型。配合分层渲染,我们应尽可能的优化刚体的解算。包裹物体就是参考复杂模型的基本外观,制作出一个简单的多边形几何体;将复杂模型作为包裹物体的子物体,然后在渲染的时候排除包裹物体(方法很多,最简单的就是将该包裹物体放于物体层中,设置层选项为Template参考模式-T字母标志;不过如果使用的是MentalRay渲染,就需要使用渲染过滤,因为MR不支持参考模式的层设置)。5 C" F8 _: R; ~8 p. X% I2 ~3 V
6 t; p# L2 t/ q% n1 s: _

8 s& n. A0 G8 `! k' Z% z" p4.赋予包裹物体刚体属性。+ [, t6 O0 k: v: h: R9 [4 j
9 a+ x, B( L  K& f8 |( Y

6 Z- O5 P  \) r7 R" [% f包裹物体刚体属性参数设置如下:
0 I8 A+ D2 x9 zInitialVelocityZ(Z轴向的初速度):-20(负号表示朝Z轴的相反方向运动)
/ m/ H6 ?/ v3 UImpulseZ(Z轴向的推力):-10(抵消部分总摩擦力)8 n  m) ?  Z9 M& b3 B, J
Mass(质量):500% ^* S1 c) Q/ H4 P6 m
Bounciness(弹性):0.3
% _/ K4 w7 x  q. L+ g5 L
0 F4 H7 q6 s0 ^# H5.动力场连接。选择车的包裹物体,执行Fields->Gravity,将重力场增加至刚体解算中。6 [$ T7 \9 V, l. O/ C9 f

4 c) j9 L7 f/ E- a) G: K0 m% D3 }- M, X: ^
6.对地面创建被动刚体。
  Q, W8 g" K: C* m/ v. E & o* E9 V  g$ b0 R) y
; Y7 l1 c+ B7 @0 x( q
7.刚体约束。选择墙壁后的球体,执行CreateNailConstraint(创建钉子约束)。创建约束或动力场连接时,Maya会自动将几何体转为刚体属性,所以可以跳过赋予刚体属性的步骤。
3 s6 Q- Z3 |+ [球体刚体属性参数设置如下:
+ d. h* O+ z$ n" S. PMass(质量):1000% L/ D/ s) q! @+ ]
Bounciness(弹性):0.1' W; A1 ~) S- B) E) ~  M' V

( W) S4 e1 \5 V
$ X- B7 |. P6 @" F" r2 g8.设定初始位置。可以使用风场将球体吹至一定高度后,再将此位置的球体设置为初始态InitialState;这里我使用一个NURBS曲线圆圈进行定位,直接移动球体的位置(钉子约束点位置不变)。- M9 _( Y. R; I; Q3 L" f. h
- [/ |, Y( l2 w! B
) p9 p& Y7 n/ j! N3 }3 S
9.手动将刚体与场景中已存在的动力场进行连接。选择球体,执行Window->RelationshipEditors->DynamicRelationships(动力学关系编辑器),点击Fields栏下的GravityField,当文字背景为默认的橙色时表示所选物体已经受重力场的影响。  K& l( d" |: [4 F# m) k9 u

2 V; N2 c$ Q0 [5 c, ^       0 |( q* |# u0 i, M' Y
2 K( ~' j# d0 f, d. V" V
: `2 ^- v) j% o
10. 测试场景。为使小球穿过墙体撞击小车,根据需要改变小车的初速度或推力。因为总摩擦力与小车的质量有关,因此初速度的能量消耗程度取决于物体质量和摩擦因数的大小。7 o* V' e' \/ X" X7 g" ~5 {6 M
# O) N! l+ U8 e* ?

, b0 {+ I9 o6 L6 t8 A( Q# ^11.墙壁刚体的制作――由于墙壁有较多的碎片小块,因此我将它留到最后再制作。全选墙壁物体,执行CreateActiveRigidBody。此时最好不要播放场景动画,因为基本上都会卡机,甚至Maya崩溃。7 s" E# I9 G6 X5 d& Z- x) V& f
解决方案(任选其一):, ~, \9 @  Z6 Y) N6 G( n
(1)缩小所有刚体,使它们之间具有一定间隔,并修改刚体解算器下的参数值-步长和碰撞容差。
; |) W2 E, z( i. e8 n' V" b& Q(2)设置刚体代理-方体和球体,降低解算质量。" c0 P/ y: Q8 l0 [- m
(3)设置碰撞层。2 A1 J) P4 s0 v! K. M
(4)设置穿插属性。
8 H+ B5 j& E3 _3 R# u2 A如果撞击发生在很短的一瞬间,且镜头上不会过多的停留在碎片的飞行中,那么可以使用方案(4),这是快速实现效果的最优选择;
" j1 W' u1 r5 ]$ o. t( y如果镜头不会停留在撞击点上(或者距离较远,可以忽略模型块的间距),我们可以使用方案(1),这可以较为完美的实现碎片飞行中的碰撞;: K$ c6 j- v: s/ K  f$ Z
如果碎片较为规则,接近于方体,可使用方案(2)刚体代理来完成;% |  T/ }, }5 A
如果你需要对不同区域的碎片进行碰撞设置,方案(3)则可以考虑,我们可以将之理解为方案(4)的扩展。
4 D# O+ \1 q) T3 V; J$ S8 r/ z有时由于一些画面视觉的要求,我们需要同时将多种方案应用于一个场景动画中,但往往还是难以达到理想的动力学解算效果。此时,我们可以对个别物体的烘焙关键帧进行细节动画的调整;如果工作量太大,对碎片进行分层渲染来避免穿插镜头也是可以考虑的。1 x8 u; |+ O0 b5 j
' c) Y: t' |# }, a
12.选择方案(4)进行。一般撞击后飞行的碎片之间的碰撞不会太多,这里我直接忽略(谁叫我使用的是一个过时了的笔记本……效率优先),遇到穿插时我更倾向于对烘焙了关键帧的物体进行个别处理。
- T- }: f  {  B! d  z9 Z(1)全选墙壁的各刚体几何体,执行CreateActiveRigidBody;) M( W. Y7 a2 D# i* [: S& [0 a! M

8 k7 I- Y# K8 G) @3 @
' m% J1 t5 r7 i2 O! P4 N(2)保持刚体全选,点击右边通道栏SHAPES下的RigidBody节点,展开属性列表,直接修改参数值如下(所有选择物体的相同属性都会被同时修改):
7 M; L# A1 _& K/ U3 P( s; ZMass(质量):20
' `8 B5 ^" |- N1 KBounciness(弹性):0.1
/ `7 H' P* b( SStandIn(替代):Cube(为了正确解算,最后我还是设为了None)
1 F& s# o+ d" \1 B 2 o: w; S; V: V; P

3 k- N8 m; d& A/ Y* g# y0 N5 E(3)保持刚体全选,执行Solvers->SetRigidBodyInterpenetration(设置刚体穿插);
0 z% M- x% ?5 r9 l* b
; i4 E! f$ t5 e9 r2 N( h* u2 H9 d5 ~1 k% |4 @( p" D% m
(4)选择最下面的几何体,将通道栏中的Active改为Off(输入0,回车即可)。, l! ~1 S: |4 s+ m" z
因为底部几何体不参与动力学解算,此步操作将所选几何体变为被动刚体,可避免它们与被动刚体地面的穿插(或者你也可以将它们与地面设置刚体穿插)-被动刚体间不会出现解算穿插的问题。5 Z7 J' r# `& T( l9 n3 X( p

* V. R7 }/ K! d  ]) @) E2 r
( a' o" T: i! a6 c, m* S3 F(5)设置了刚体间的穿插,可以获得流畅的动力学解算效果,并且除了刚体碎片间的碰撞,它们与场景中其他刚体的碰撞还是会被真实的解算出来。如果仍打算将解算质量降到最低来提高解算速度,可以将所选刚体的通道栏的StandIn设置为Cube,并将刚体解算器RigidSolver节点的StepSize(步长)和CollisionTolerance(碰撞容差)数值提高,而RigidSolverMethods设置为MidPoint。
3 `! |- `+ K: W& T; K( U$ i 0 _- z2 X# [" p% Y8 s+ h4 N

) V# H. v# f7 k0 r- W6 T: `(6)播放场景动画进行测试。当动画达到预想效果,对墙体刚体设置重力场。
+ s, ]8 F( ^# i! @6 w1 Q7 G; C
% L/ r9 }' t( k  l4 l7 z: O/ Q! y1 b6 i+ H1 i/ I5 W
在碎片被撞击飞出之前,我不打算让它受到重力场的作用而运动,因此我需要加入一个新的重力场,并对力场设置关键帧:将重力场的Magnitude(强度)设置为0;在发生撞击的那一帧设置关键帧(KeySelected),然后在下一帧更改Magnitude数值为9.8并设置关键帧。% l9 {7 X& t, C6 R

  ?& t& M' l" ~6 T! c/ N# Y5 l* Y1 m) S2 Q/ M) e
; l1 Z) G1 b$ ^, {1 d$ h! Y
6 Z7 N" @$ D% Y: p& |4 G

' {; `% @- K8 F: q(7)选择那些不打算参与解算的模型,将它们通道栏的Ignore设置为On。* x+ I2 W: d2 \% m) L
1 J. F% g6 ?/ I$ ]% g
# c# H$ U" X' }4 S* p* q6 r! @9 a/ W
(8)播放动画,发现碰撞区的一些碎片与剩余的墙体发生穿插。
' R* _0 W: x7 z9 {6 j : M' _0 h8 u; d0 n. L

: z/ r% a  b. L4 b# U9 h5 J* U! D8 A6 E, e/ w- p# B
要解决这个问题,可以选择这些刚体,恢复它们的碰撞属性(SetRigidBodyCollision)――如果恢复的刚体太多,那又回到了设置穿插属性之前;根据镜头需要,常常需要进行分层渲染或调节烘焙关键帧来解决物体穿帮的镜头(华丽的特效是要慢慢磨出来的)。2 Q1 ~4 D% I+ f! G' X) u
, S4 y& }8 q0 P: o# M2 x; l5 B
# m, @7 x! w! {- j
(9)当动画效果基本达到,烘焙动力学模拟的关键帧(BakeSimulation),然后删除所有刚体属性。
6 B" J: d' E' m3 R*国际惯例,将关键帧的总长度压缩为一半左右。3 s2 ~0 P% m7 D2 L8 x  |# x

, _' Q( p* Y1 d  c2 I: }
+ x  k6 b9 c  t! K6 `4 x2 D) z6 b
4 {  c( c4 ]/ l0 c1 C! w( Z13.设置镜头及灯光,渲染。当加入一些粒子特效(3D粒子或平面粒子)及碎片飞行的运动模糊,并在后期合成中完成震镜效果,一个很酷的撞击特效也就产生了。以下使用平面粒子软件ParticleIllusion素材中的一个简单烟效进行合成的效果演示。( q8 k7 o  N& X0 c

' [. q! {3 O1 B" w9 j- W+ v; j
      
1 y* D3 \! U# F/ x5 T14.最终效果(太大图片网络观看会比较卡,因此设置为低质量的GIF图片)。
% s2 G! e" O3 a6 O& [ ' Y/ O  @% b+ [
8 z: P' X8 ~: \
15.技术点总结:
  L. j! U$ B6 |' M切割物体-设置刚体属性-添加力场和碰撞-设置刚体穿插-烘焙动力学关键帧4 n# e" s( K2 t: P0 k2 u
, j: L5 d3 `* F& [  m, j( x

* ~) H! r/ e0 h3 U; ?

评分

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

查看全部评分

B Color Smilies

全部评论3

你可能喜欢

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