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

2012-03-20 14:53 发布

2942 3 0
现在我们来弄一个比较复杂的刚体动力学特效。一个大铁球撞破墙壁,一辆路过的小轿车被碎石击中,然后变向(危险行为,请勿模仿)。
7 i2 h( w! A' W$ N$ ` , W3 n6 t# @) q) I/ r* s4 Y
' N. k1 R/ _) }+ p
1.墙壁的创建。
& ~6 F. W+ R& H. D1 z, C, W这里就不与BlastCode这样专业的破碎插件进行比较了,我使用Maya最平常的方法创建出即将破碎的墙壁。) H: G0 T; \7 c6 Q4 G/ o+ D
Maya制作模型碎片的一些方法:3 {4 f4 H9 E+ Y+ m) V) L  J
(1)使用CutFacesTool对模型进行直线切割。这种方法可以得到很规整的模型,尤其可以应用于复杂几何体的切割,不过缺点就是操作繁琐。6 C" g" r2 Z' q/ }
(2)使用SplitPolygonTool在简单的平面上描绘出裂痕,然后使用提取面命令分离这些面(执行Extract命令前KeepFacesTogether要先去掉勾选)。
# O9 o3 T" H) L   Z0 k$ s0 i) ~$ G( b9 F& Y

: a6 q9 c0 Q. K* W1 ~2 i7 Z5 L2 i / _7 G6 q1 z# Q5 V+ c8 R9 @
" Y8 l5 m  u0 S/ h3 t8 C
  \8 `5 a& X$ Q2 i: M
(3)使用内核布料系统的布料切割,不过碎片会比较整齐。
& G& _" E$ A5 h7 ^' f(4)使用Dynamics动力学模块下Effects菜单的Shatter。此命令要求模型无历史,且材质不能太复杂,在圆弧表面的几何体上容易发生形变。
& R5 `3 A; R! m(5)使用SplitVertex切分点工具。此命令会将点周围的边全部分离,与布料的切割类似。: F: l" B7 o+ [9 H; M& z4 L0 V
(6)使用自定义的色块贴图,执行贴图转几何体命令(TextureToGeometry),然后提取面分离。这是最省事的方法,可控性也高,不过太复杂的贴图Maya会需要大量的运算时间。与BlastCode插件的破碎贴图有点类似。- S3 p8 x7 I; j2 t: Q" D. l5 p4 N2 _
这里,我所进行的步骤如下:
1 H+ j6 v) e9 `/ T% z(1)使用CutFacesTool将面片切割为几大块;& H0 M8 k' b# N! h; A, z3 L3 ~+ u2 j

4 W8 |# i. e9 S6 e! m2 ?
/ l% ?( C- C8 F0 k(2)对撞击中心的区域模型进行细分操作:EditMesh->AddDivisions;
* u4 U4 d5 b* h! j3 W3 [. G; j . V# i+ Y5 l* V5 X" ?$ O( b" Q
(3)删除所有碎片的历史,对细分后的碎片执行:Effects->CreateShatter(粉碎);+ P: c. U8 V7 F( Z, c9 q
) b9 F. @0 a$ _  ~% s" b1 T2 s
6 u& I; T, |. Z" a
(4)全选整个墙体模型,执行Extrude(挤压)命令,制作出厚度;
$ y7 N2 a) p$ q  i+ p0 E # W" M" S1 P6 D( R* m0 Z5 e

. E6 x4 u* }) W(5)全选整个墙体模型,执行Combine(合并)命令,合并为一个物体以方便编辑UV;( U# u: e8 b' A
/ I6 H( X" v- ?" B
0 U% y3 O- t4 e5 _+ _; w. F
(6)选择这个合并后的模型,使用一个平面的UV贴图投射PlanarMapping(如果也需要对模型的厚度进行单独UV展开,可以在侧视图选择这些模型面后进行AutomaticMapping);
" n8 j9 k( n& k8 _) d
" O- [& G* e" s0 o4 U
2 H/ O; d& U: E(7)选择模型,执行Separate(分离),再次将模型分离为独立的小块,然后删除所有历史。
$ V; B. k& _4 z  R( L4 m6 p" h
+ e  m5 \! Q8 ]/ @/ _* n1 J5 J$ Q% P$ j/ s; y
(8)除了删除操作历史,冻结坐标(FreezeTransformations)和轴心居中(CenterPivot)也是很重要的操作。如果你在执行刚体解算时发生异常(如碰撞后刚体方向,旋转或大小很不合理的变化),那么最大的可能就是刚体物体或者其所在的组的变形属性(位置,旋转,缩放)的初始态有数值变化。) v6 f7 m- q" o5 j" {  m
: \0 d3 C% ?$ O

6 h" k- r6 c& P. V; M: u1 P8 \(9)赋予模型贴图。与常规的模型贴图是一样的,没太多需要说明的,不过要注意的一点就是:由于是会产生动力学动画的物体,因此不可使用3D纹理节点进行贴图(谁用谁知道……)。, q. w) _; p" _

; a9 u0 T. o  W- `* u  H* g; X4 Y1 l- a

: K2 |- o: W: U9 U2.其他场景物体。斜坡,地平面,小车,大铁球。
6 d# e# p& X  g7 ]2 _; V" Z% f. d 9 d' T/ e1 w! ]3 ?* ]* k

: z+ ?* [! @1 y( Y+ ^7 U3.制作包裹物体(刚体代理)。刚体的模拟是很耗费资源的,尤其是过于复杂的模型。配合分层渲染,我们应尽可能的优化刚体的解算。包裹物体就是参考复杂模型的基本外观,制作出一个简单的多边形几何体;将复杂模型作为包裹物体的子物体,然后在渲染的时候排除包裹物体(方法很多,最简单的就是将该包裹物体放于物体层中,设置层选项为Template参考模式-T字母标志;不过如果使用的是MentalRay渲染,就需要使用渲染过滤,因为MR不支持参考模式的层设置)。
- q1 [% j! v4 S& v% ` 5 ]2 J5 n' Z- {0 P4 v$ e5 z$ @

6 H- U) \) {  ]* h8 r, _4.赋予包裹物体刚体属性。
$ |$ O0 t7 k; m4 l8 B9 I: }: P 4 r1 f5 B* v! ]4 _4 L
3 z; S; s$ c; Y3 _1 q& {7 o* m2 b
包裹物体刚体属性参数设置如下:
4 D% i4 L( A# @- C, @/ UInitialVelocityZ(Z轴向的初速度):-20(负号表示朝Z轴的相反方向运动)4 \$ A; t, @+ g3 Q
ImpulseZ(Z轴向的推力):-10(抵消部分总摩擦力)
  T7 l/ w8 F$ y$ S% LMass(质量):500+ \. A( ~; e; Z  E+ E
Bounciness(弹性):0.3! b% V- V5 J7 {
# C( `0 d6 u; S8 }
5.动力场连接。选择车的包裹物体,执行Fields->Gravity,将重力场增加至刚体解算中。
* }  `: e7 Y$ M) w6 ` " s/ C1 w2 Q4 w7 `% j

- [' e. s$ r, }) J  e  r6.对地面创建被动刚体。8 r1 u" {6 T, j8 j/ o% {
2 Z- F8 M8 b/ j1 T2 A
5 M8 B( H4 U$ Q6 @
7.刚体约束。选择墙壁后的球体,执行CreateNailConstraint(创建钉子约束)。创建约束或动力场连接时,Maya会自动将几何体转为刚体属性,所以可以跳过赋予刚体属性的步骤。( y2 E. k7 v0 Z: y
球体刚体属性参数设置如下:1 J% D& e: Z( i1 b7 v
Mass(质量):1000
) N. z. q! u5 {# _- R# c: xBounciness(弹性):0.17 X1 T7 a! n3 ~, h  j# Q8 m" C8 j

2 C3 V2 r7 g& W; G( ^* ]- m* r$ O: B. Q9 A* ~+ H9 }4 A2 P4 w7 b; H
8.设定初始位置。可以使用风场将球体吹至一定高度后,再将此位置的球体设置为初始态InitialState;这里我使用一个NURBS曲线圆圈进行定位,直接移动球体的位置(钉子约束点位置不变)。/ k4 _) E! t! f3 d* _6 s( i- {
( d3 b1 h. Y' z! D% q, a1 W/ z
6 f2 q5 J. \8 ?" l
9.手动将刚体与场景中已存在的动力场进行连接。选择球体,执行Window->RelationshipEditors->DynamicRelationships(动力学关系编辑器),点击Fields栏下的GravityField,当文字背景为默认的橙色时表示所选物体已经受重力场的影响。7 X# g; v" K+ d+ d6 D4 I" {

1 a9 h! Z$ d  s4 g/ m0 H; a      
* z- @- z8 c1 t9 F' ?3 q0 K; v
- i6 g& m5 D1 `9 ]7 I) J 5 g* C/ \/ |: m2 N  G4 w! I
10. 测试场景。为使小球穿过墙体撞击小车,根据需要改变小车的初速度或推力。因为总摩擦力与小车的质量有关,因此初速度的能量消耗程度取决于物体质量和摩擦因数的大小。
+ u/ D" G& ]0 A! L5 U9 h 7 m3 e2 j+ U: R2 D& J
. `3 H' ]# q  ~1 S6 x' s4 `* U
11.墙壁刚体的制作――由于墙壁有较多的碎片小块,因此我将它留到最后再制作。全选墙壁物体,执行CreateActiveRigidBody。此时最好不要播放场景动画,因为基本上都会卡机,甚至Maya崩溃。
- R" K3 M) {# F! m+ P! K解决方案(任选其一):6 G$ D. g- W+ C  c- E: B1 l* J9 F
(1)缩小所有刚体,使它们之间具有一定间隔,并修改刚体解算器下的参数值-步长和碰撞容差。$ k2 P  ]9 D0 x, J" i9 h
(2)设置刚体代理-方体和球体,降低解算质量。
$ x2 w9 F$ `2 g+ g. O5 x(3)设置碰撞层。8 Y( T/ @6 T6 }# `3 N. c8 _
(4)设置穿插属性。
3 W" A" ?4 T: u如果撞击发生在很短的一瞬间,且镜头上不会过多的停留在碎片的飞行中,那么可以使用方案(4),这是快速实现效果的最优选择;5 V" H: m& T! ~5 S7 I0 F+ p
如果镜头不会停留在撞击点上(或者距离较远,可以忽略模型块的间距),我们可以使用方案(1),这可以较为完美的实现碎片飞行中的碰撞;
' T5 g+ U* S) C' `如果碎片较为规则,接近于方体,可使用方案(2)刚体代理来完成;
$ O" b0 L5 ~/ L如果你需要对不同区域的碎片进行碰撞设置,方案(3)则可以考虑,我们可以将之理解为方案(4)的扩展。2 l5 x/ L$ P$ O9 j/ w( ]
有时由于一些画面视觉的要求,我们需要同时将多种方案应用于一个场景动画中,但往往还是难以达到理想的动力学解算效果。此时,我们可以对个别物体的烘焙关键帧进行细节动画的调整;如果工作量太大,对碎片进行分层渲染来避免穿插镜头也是可以考虑的。
* P$ ]: P, ^" d; n6 i7 m- u$ k4 y# i; l: x4 R8 _
12.选择方案(4)进行。一般撞击后飞行的碎片之间的碰撞不会太多,这里我直接忽略(谁叫我使用的是一个过时了的笔记本……效率优先),遇到穿插时我更倾向于对烘焙了关键帧的物体进行个别处理。
- w" b, v1 q/ X" s(1)全选墙壁的各刚体几何体,执行CreateActiveRigidBody;
2 f0 V% c9 l) x4 b" K / e3 }" J" D$ B! V5 a% `

! ~. T5 ]. @; |9 X9 b+ k- H(2)保持刚体全选,点击右边通道栏SHAPES下的RigidBody节点,展开属性列表,直接修改参数值如下(所有选择物体的相同属性都会被同时修改):7 s2 z. S, Z+ Y/ Q
Mass(质量):20
, J2 O! S: w5 `2 o. I& m* kBounciness(弹性):0.1
" L; p: H( s6 U4 k) bStandIn(替代):Cube(为了正确解算,最后我还是设为了None)
5 L* E% S! q! K6 n3 u, ~ # j8 t: m1 Q$ \% L& M
. x: A( x' r; y" @  L
(3)保持刚体全选,执行Solvers->SetRigidBodyInterpenetration(设置刚体穿插);
% o8 R: `0 j2 d/ Q! z8 y" f. R
8 d9 P% a0 [3 `. Z& q8 E& @4 E8 @# `" ^8 F$ y/ k4 w
(4)选择最下面的几何体,将通道栏中的Active改为Off(输入0,回车即可)。: J+ ]' ^8 ]3 m  f
因为底部几何体不参与动力学解算,此步操作将所选几何体变为被动刚体,可避免它们与被动刚体地面的穿插(或者你也可以将它们与地面设置刚体穿插)-被动刚体间不会出现解算穿插的问题。
0 E3 w. e, S* e* V) U0 U+ k0 x
1 ]# @6 A! X/ A. R3 }" Z- c
2 D. a) [# O, g) c) @(5)设置了刚体间的穿插,可以获得流畅的动力学解算效果,并且除了刚体碎片间的碰撞,它们与场景中其他刚体的碰撞还是会被真实的解算出来。如果仍打算将解算质量降到最低来提高解算速度,可以将所选刚体的通道栏的StandIn设置为Cube,并将刚体解算器RigidSolver节点的StepSize(步长)和CollisionTolerance(碰撞容差)数值提高,而RigidSolverMethods设置为MidPoint。
  I' p' |& J- T! x: }. c" Q5 I 2 Z' O3 {6 R) J- ^! W/ }9 t
+ k# j+ I6 ~6 z" |' ]( K
(6)播放场景动画进行测试。当动画达到预想效果,对墙体刚体设置重力场。
$ n( @% h0 `6 _4 l4 z$ p# L 3 p, G$ x4 q# P! O2 o
; _+ Y/ _) [. I7 r1 u! s' s3 L
在碎片被撞击飞出之前,我不打算让它受到重力场的作用而运动,因此我需要加入一个新的重力场,并对力场设置关键帧:将重力场的Magnitude(强度)设置为0;在发生撞击的那一帧设置关键帧(KeySelected),然后在下一帧更改Magnitude数值为9.8并设置关键帧。) {; s# P6 S" A; y, U  M. S8 p
6 R/ [4 H% S# i5 m

) q: |/ i( t% } ( A) E; M0 A. K1 H# d: l
9 x/ v/ e& l& A% r
0 R/ G& E& _( C5 x
(7)选择那些不打算参与解算的模型,将它们通道栏的Ignore设置为On。2 P/ u; T  C( O0 f* ~' m# r
5 M4 V2 e2 ~' y& K( O
( T0 c# G- K' G0 _7 q  e) x; r
(8)播放动画,发现碰撞区的一些碎片与剩余的墙体发生穿插。/ ~0 B8 U! T  I; i: w
$ ~* w) }. {6 J
6 M# n$ N* Y+ m- Q( r

8 K( b( J! [+ b& \要解决这个问题,可以选择这些刚体,恢复它们的碰撞属性(SetRigidBodyCollision)――如果恢复的刚体太多,那又回到了设置穿插属性之前;根据镜头需要,常常需要进行分层渲染或调节烘焙关键帧来解决物体穿帮的镜头(华丽的特效是要慢慢磨出来的)。
0 e- C- o# @& L. d4 h% c" P$ E % G1 M) @  v; Y  _) d
( F* g3 T4 H' u$ h" y% v* g& ?, B
(9)当动画效果基本达到,烘焙动力学模拟的关键帧(BakeSimulation),然后删除所有刚体属性。9 Y1 Z6 P4 z0 G2 g
*国际惯例,将关键帧的总长度压缩为一半左右。! |- Q8 m# `6 P; w% ~; `
0 ?3 U2 T4 R( w# ^& m# t" n0 D; ^
# ^) m- e. c6 W2 h% K, a3 l4 _$ S
' g5 I4 \" q0 o* l- f
13.设置镜头及灯光,渲染。当加入一些粒子特效(3D粒子或平面粒子)及碎片飞行的运动模糊,并在后期合成中完成震镜效果,一个很酷的撞击特效也就产生了。以下使用平面粒子软件ParticleIllusion素材中的一个简单烟效进行合成的效果演示。
' ]$ d# V1 Z8 y3 ^% [; D
7 z+ i" p9 q7 C! K! s+ J  l* N, m- C9 C' u( ^/ L
      
; E0 a2 W& A8 W) d. Z4 x14.最终效果(太大图片网络观看会比较卡,因此设置为低质量的GIF图片)。3 N* e7 J- H8 m) z

0 I- N, {8 f7 D. F5 q" }' D' Q) [+ N* q; b" R" `  |; V
15.技术点总结:
1 `8 P" X, a; C' j切割物体-设置刚体属性-添加力场和碰撞-设置刚体穿插-烘焙动力学关键帧
: R# F6 z  C' a+ f3 v

# b- k: X8 a8 c( @
$ h9 s# o3 @% U0 }+ ^( @( q# k

评分

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

查看全部评分

B Color Smilies

全部评论3

你可能喜欢

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