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

2012-03-20 14:53 发布

2949 3 0
现在我们来弄一个比较复杂的刚体动力学特效。一个大铁球撞破墙壁,一辆路过的小轿车被碎石击中,然后变向(危险行为,请勿模仿)。; _; |0 L) @& s0 P( Y4 }
: K- [2 \' G0 |) G
* Q/ D6 o9 n* U) y5 b
1.墙壁的创建。; _6 o2 P; ?4 K5 S1 O% D! C
这里就不与BlastCode这样专业的破碎插件进行比较了,我使用Maya最平常的方法创建出即将破碎的墙壁。
- _7 A7 C0 _/ QMaya制作模型碎片的一些方法:
, [; ^# b* O2 b* d5 Q(1)使用CutFacesTool对模型进行直线切割。这种方法可以得到很规整的模型,尤其可以应用于复杂几何体的切割,不过缺点就是操作繁琐。! y; M2 \, a+ ^2 M
(2)使用SplitPolygonTool在简单的平面上描绘出裂痕,然后使用提取面命令分离这些面(执行Extract命令前KeepFacesTogether要先去掉勾选)。! k% x; P1 C  }

9 h0 ?& ^0 |9 j; `# z/ e, g! t* ?6 f
' z# M' P: l4 s) z5 ^2 ?. ~- V
7 C: p: L, Q" h9 l
( B- y0 A+ n! e0 R/ A$ {
$ M4 C, L/ P& G. N! ~* t(3)使用内核布料系统的布料切割,不过碎片会比较整齐。7 i) s" E8 }/ l$ z: ?1 W/ M
(4)使用Dynamics动力学模块下Effects菜单的Shatter。此命令要求模型无历史,且材质不能太复杂,在圆弧表面的几何体上容易发生形变。/ \3 e' _1 v7 Q5 }
(5)使用SplitVertex切分点工具。此命令会将点周围的边全部分离,与布料的切割类似。
! V$ O* \+ g# b2 ?! S+ N(6)使用自定义的色块贴图,执行贴图转几何体命令(TextureToGeometry),然后提取面分离。这是最省事的方法,可控性也高,不过太复杂的贴图Maya会需要大量的运算时间。与BlastCode插件的破碎贴图有点类似。
) P# P: X3 a3 t( O$ L这里,我所进行的步骤如下:
) ]( s& ?6 X) K- J! ?7 n(1)使用CutFacesTool将面片切割为几大块;
& h: _' r+ d3 v' E) ~$ U3 o; O " W9 D7 D7 ]3 v* |' {
3 k, A0 W. @' Z+ h0 P9 @
(2)对撞击中心的区域模型进行细分操作:EditMesh->AddDivisions;) D. l9 r6 Q5 a+ v$ T& p; B
! X. j$ y* M' Y& ]/ [
(3)删除所有碎片的历史,对细分后的碎片执行:Effects->CreateShatter(粉碎);. c- S/ h  F6 o! s% I
6 f; n' j# {  X* S8 ?2 [/ i

5 ?& Z  y. ^! W3 U(4)全选整个墙体模型,执行Extrude(挤压)命令,制作出厚度;2 ?! W7 D9 I$ O3 R; v5 {3 Q
1 T" M. l6 n" E7 ^
8 r, j. o( |3 i. J
(5)全选整个墙体模型,执行Combine(合并)命令,合并为一个物体以方便编辑UV;
3 j1 ~+ |8 p& ?2 V 7 s) B, X& O, g# l
- Y7 E: V+ A0 Q8 e+ Q
(6)选择这个合并后的模型,使用一个平面的UV贴图投射PlanarMapping(如果也需要对模型的厚度进行单独UV展开,可以在侧视图选择这些模型面后进行AutomaticMapping);
( x" s9 @3 D' s% R% p/ `0 u
. c" v/ |& k9 p2 @$ T
& C* ~+ k. `& i& w9 `* j(7)选择模型,执行Separate(分离),再次将模型分离为独立的小块,然后删除所有历史。' l( a5 I5 W$ H6 u- y

/ _' j3 E. y: a9 S: e" `0 k0 M# {1 `6 m' |( a4 X6 G
(8)除了删除操作历史,冻结坐标(FreezeTransformations)和轴心居中(CenterPivot)也是很重要的操作。如果你在执行刚体解算时发生异常(如碰撞后刚体方向,旋转或大小很不合理的变化),那么最大的可能就是刚体物体或者其所在的组的变形属性(位置,旋转,缩放)的初始态有数值变化。$ U/ b/ Z+ _2 w3 @; I. D

- p- z+ G1 f) x/ N$ b. J+ g
, A' V5 |! [/ w$ y(9)赋予模型贴图。与常规的模型贴图是一样的,没太多需要说明的,不过要注意的一点就是:由于是会产生动力学动画的物体,因此不可使用3D纹理节点进行贴图(谁用谁知道……)。0 T4 Y, [6 G4 B5 E/ A+ p" ^
! a; p# p8 J$ R- |3 J

; q2 g0 M! v, M3 w) J* ~* h) i6 ^
# q4 S2 w/ O$ a& O% v6 B4 q2.其他场景物体。斜坡,地平面,小车,大铁球。4 u$ A; S! C5 d4 S  v1 v
0 u: C  {; ], G
/ l$ l9 I1 w  w- J1 B) p# S
3.制作包裹物体(刚体代理)。刚体的模拟是很耗费资源的,尤其是过于复杂的模型。配合分层渲染,我们应尽可能的优化刚体的解算。包裹物体就是参考复杂模型的基本外观,制作出一个简单的多边形几何体;将复杂模型作为包裹物体的子物体,然后在渲染的时候排除包裹物体(方法很多,最简单的就是将该包裹物体放于物体层中,设置层选项为Template参考模式-T字母标志;不过如果使用的是MentalRay渲染,就需要使用渲染过滤,因为MR不支持参考模式的层设置)。
$ q  N8 T# [( M # q" L2 K' s; Y6 T6 x  |

4 c8 G; |  k, q2 y1 V, F3 W! }4.赋予包裹物体刚体属性。
! ?: z" O# w& Y  |% r% H
2 W+ G/ A7 q% ~2 N6 U& i
  N6 a! c( O1 |% f( |7 }包裹物体刚体属性参数设置如下:! ~( }( R$ [5 J$ j) P/ O4 }' N
InitialVelocityZ(Z轴向的初速度):-20(负号表示朝Z轴的相反方向运动)1 |& u% N$ M9 f5 A& X
ImpulseZ(Z轴向的推力):-10(抵消部分总摩擦力)0 C: {# z0 |4 t" m" ?
Mass(质量):500
% |+ c7 H: a7 U) gBounciness(弹性):0.3
: J9 l# U+ l; D9 ]' u9 A 3 |% V9 a; `( f1 ^
5.动力场连接。选择车的包裹物体,执行Fields->Gravity,将重力场增加至刚体解算中。
  z. L% k& o6 k& e' B/ t) T; ^
4 }% Q  s; }; _& s% P; \  ^$ K  ]
1 L. n" y" Y$ o# t% R. X6.对地面创建被动刚体。
, e% j( _$ N5 [- ]8 m( i
0 \. ~6 X& a; v2 j+ j
2 v# O' w8 S! O/ i* L7.刚体约束。选择墙壁后的球体,执行CreateNailConstraint(创建钉子约束)。创建约束或动力场连接时,Maya会自动将几何体转为刚体属性,所以可以跳过赋予刚体属性的步骤。
4 t) O0 m. V1 U- B1 s球体刚体属性参数设置如下:- f% C- n. w3 K3 m. c
Mass(质量):1000
1 w0 ^. W  u: |0 K+ p& T: \0 KBounciness(弹性):0.1! D, `$ L2 k; E- i4 p

) [: M! R; e" e, d( i) ?7 k& g+ U0 E- s' l2 u$ p4 C, {
8.设定初始位置。可以使用风场将球体吹至一定高度后,再将此位置的球体设置为初始态InitialState;这里我使用一个NURBS曲线圆圈进行定位,直接移动球体的位置(钉子约束点位置不变)。6 q$ D& z$ S1 C& I

7 E6 _$ I6 T5 ]1 p3 Q+ ^
: e$ q1 h0 F. G; |& q9.手动将刚体与场景中已存在的动力场进行连接。选择球体,执行Window->RelationshipEditors->DynamicRelationships(动力学关系编辑器),点击Fields栏下的GravityField,当文字背景为默认的橙色时表示所选物体已经受重力场的影响。
( X# E$ ^' t8 b' a7 l6 Q2 ] 8 e0 D& c8 v- J/ z- s7 R
      
, }: ~7 X0 u5 p. l( S0 z  _4 m) {- t( `0 q

3 T8 t/ V1 m; }5 {( ?% E. m10. 测试场景。为使小球穿过墙体撞击小车,根据需要改变小车的初速度或推力。因为总摩擦力与小车的质量有关,因此初速度的能量消耗程度取决于物体质量和摩擦因数的大小。
% O0 R  b6 D6 P+ {" q0 q : Z: j; d4 C1 h

' P2 z0 b3 U: o11.墙壁刚体的制作――由于墙壁有较多的碎片小块,因此我将它留到最后再制作。全选墙壁物体,执行CreateActiveRigidBody。此时最好不要播放场景动画,因为基本上都会卡机,甚至Maya崩溃。
; t: q4 J: v* i4 n' u解决方案(任选其一):9 y. S% M; P0 B2 ?1 m5 W% {3 Y
(1)缩小所有刚体,使它们之间具有一定间隔,并修改刚体解算器下的参数值-步长和碰撞容差。$ D% o) |) n1 ]5 l& i
(2)设置刚体代理-方体和球体,降低解算质量。
; j: D7 @  h1 [$ b' S6 w(3)设置碰撞层。3 Z& `& }  l* L4 U2 ]$ V0 O9 h& R
(4)设置穿插属性。
) V: q: S# X$ x' l7 C; z! J如果撞击发生在很短的一瞬间,且镜头上不会过多的停留在碎片的飞行中,那么可以使用方案(4),这是快速实现效果的最优选择;
: c3 j2 g# R4 |. y如果镜头不会停留在撞击点上(或者距离较远,可以忽略模型块的间距),我们可以使用方案(1),这可以较为完美的实现碎片飞行中的碰撞;4 M8 g+ {0 g+ }+ C6 g; x2 b
如果碎片较为规则,接近于方体,可使用方案(2)刚体代理来完成;3 q. j: v, ?5 t/ h9 d- ~7 Y% y
如果你需要对不同区域的碎片进行碰撞设置,方案(3)则可以考虑,我们可以将之理解为方案(4)的扩展。) R$ V* y2 ?% ~( f
有时由于一些画面视觉的要求,我们需要同时将多种方案应用于一个场景动画中,但往往还是难以达到理想的动力学解算效果。此时,我们可以对个别物体的烘焙关键帧进行细节动画的调整;如果工作量太大,对碎片进行分层渲染来避免穿插镜头也是可以考虑的。# \. w; T( b$ i4 ]& s- f

: c1 r, \9 g" t. I6 _12.选择方案(4)进行。一般撞击后飞行的碎片之间的碰撞不会太多,这里我直接忽略(谁叫我使用的是一个过时了的笔记本……效率优先),遇到穿插时我更倾向于对烘焙了关键帧的物体进行个别处理。
$ y6 D- P. M5 o. p3 S(1)全选墙壁的各刚体几何体,执行CreateActiveRigidBody;  `2 R" d1 F( @1 ~
- a& ~% N2 K( s2 L& |2 a' E
1 O- d5 f% [% n% V% g
(2)保持刚体全选,点击右边通道栏SHAPES下的RigidBody节点,展开属性列表,直接修改参数值如下(所有选择物体的相同属性都会被同时修改):
$ L' h' [/ _- N3 TMass(质量):20
/ b, x% H4 V  y0 q9 a7 pBounciness(弹性):0.1
" K9 P* {3 g  y* CStandIn(替代):Cube(为了正确解算,最后我还是设为了None); q/ c4 {; r2 U/ d4 T9 c
/ `: N4 i, X( @8 ?0 n8 T
- L$ }; a, h1 b5 [
(3)保持刚体全选,执行Solvers->SetRigidBodyInterpenetration(设置刚体穿插);" q2 K- \& f# }, W' `4 S

7 ^% x) ?( K* l/ a; D; n7 k3 k! \7 }) p" F! h: n+ U' x, l* ?
(4)选择最下面的几何体,将通道栏中的Active改为Off(输入0,回车即可)。7 P  b9 I& {& X7 h) {! j, `2 s) l$ _
因为底部几何体不参与动力学解算,此步操作将所选几何体变为被动刚体,可避免它们与被动刚体地面的穿插(或者你也可以将它们与地面设置刚体穿插)-被动刚体间不会出现解算穿插的问题。' {2 l# W  q" g! O  g
. n) J6 t4 W; H$ l! N, @
4 N( W) L0 e" h' i1 o1 |' `
(5)设置了刚体间的穿插,可以获得流畅的动力学解算效果,并且除了刚体碎片间的碰撞,它们与场景中其他刚体的碰撞还是会被真实的解算出来。如果仍打算将解算质量降到最低来提高解算速度,可以将所选刚体的通道栏的StandIn设置为Cube,并将刚体解算器RigidSolver节点的StepSize(步长)和CollisionTolerance(碰撞容差)数值提高,而RigidSolverMethods设置为MidPoint。- g3 @, {( d0 q1 w/ `6 a2 L

, H  ]) Q2 K& h$ {
9 \2 J6 X3 @) E" f6 g# g(6)播放场景动画进行测试。当动画达到预想效果,对墙体刚体设置重力场。. {2 ]2 i* f& ^
, ~% b( t% |' t+ z8 D- H
$ d' u' Y% V2 _( D! b0 ^! q
在碎片被撞击飞出之前,我不打算让它受到重力场的作用而运动,因此我需要加入一个新的重力场,并对力场设置关键帧:将重力场的Magnitude(强度)设置为0;在发生撞击的那一帧设置关键帧(KeySelected),然后在下一帧更改Magnitude数值为9.8并设置关键帧。
1 f2 P% ~) k8 p! F* ] 2 E: [7 q/ V& a7 n( z3 m0 x
. h' ]  y+ s- p: O, a

# p+ @+ C2 n. `/ Q: N4 e3 a' D* V. k! y' c% C. G% \* q+ H
2 H( H' T: s$ h
(7)选择那些不打算参与解算的模型,将它们通道栏的Ignore设置为On。( c) B7 \( Y% n# u

/ B  A& O$ `$ p0 J& n* t# ?; ^( {& {; ~% {. k0 |- n, V0 ]5 ~
(8)播放动画,发现碰撞区的一些碎片与剩余的墙体发生穿插。
/ J; t9 V' @' @
$ w1 g/ h" m' Z: z( T; g
% D/ w0 P" c( D7 s. b: N
: R/ M1 y% J% C$ l& M要解决这个问题,可以选择这些刚体,恢复它们的碰撞属性(SetRigidBodyCollision)――如果恢复的刚体太多,那又回到了设置穿插属性之前;根据镜头需要,常常需要进行分层渲染或调节烘焙关键帧来解决物体穿帮的镜头(华丽的特效是要慢慢磨出来的)。
& M$ w- A: x* p8 I5 U
# u; `; M+ W2 E3 c  l( q( ^3 L5 k
(9)当动画效果基本达到,烘焙动力学模拟的关键帧(BakeSimulation),然后删除所有刚体属性。
" e* d' z( u7 Z# q*国际惯例,将关键帧的总长度压缩为一半左右。
$ o6 ]$ k' u# j6 i" B+ ]5 J 8 w, W( D7 Q" q
+ Z( V, E9 g1 s/ E8 @, ^( |4 e

: G0 c6 E2 `; m* j) g3 A13.设置镜头及灯光,渲染。当加入一些粒子特效(3D粒子或平面粒子)及碎片飞行的运动模糊,并在后期合成中完成震镜效果,一个很酷的撞击特效也就产生了。以下使用平面粒子软件ParticleIllusion素材中的一个简单烟效进行合成的效果演示。
' _  B' r9 n, a) c 3 d- d& t$ ^5 _4 E4 w
" ?& `" g1 J, t) `& p  V7 a
       & z& u! A  o; L. Y' K" C! l4 n1 G  s
14.最终效果(太大图片网络观看会比较卡,因此设置为低质量的GIF图片)。
: k9 F! J1 l; K0 y: c 2 I' i  y# L. }, `" [: Y( J

. N' e9 x8 \7 R. ^" \15.技术点总结:
0 |6 p) i' v/ q! C* g0 A8 C/ V切割物体-设置刚体属性-添加力场和碰撞-设置刚体穿插-烘焙动力学关键帧  d5 j3 s3 y9 t5 U
  W6 ~. X2 d2 D4 q5 @. K" s( i5 _* f

. q. B5 U- U% N6 \6 Q# r

评分

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

查看全部评分

B Color Smilies

全部评论3

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