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

2012-03-20 14:53 发布

2944 3 0
现在我们来弄一个比较复杂的刚体动力学特效。一个大铁球撞破墙壁,一辆路过的小轿车被碎石击中,然后变向(危险行为,请勿模仿)。' M) }6 P9 e% c; E2 n2 n) C& B
2 ~* V- @# a% i7 o: M* b

# s7 J! R" f* Z* a9 k/ g" K1.墙壁的创建。2 _# ^  Q, u/ R8 x
这里就不与BlastCode这样专业的破碎插件进行比较了,我使用Maya最平常的方法创建出即将破碎的墙壁。  |4 y5 s8 x1 r' L
Maya制作模型碎片的一些方法:) I- [4 I! M& e" Y& q# D& N
(1)使用CutFacesTool对模型进行直线切割。这种方法可以得到很规整的模型,尤其可以应用于复杂几何体的切割,不过缺点就是操作繁琐。! B$ s$ z1 Q# t9 J* X
(2)使用SplitPolygonTool在简单的平面上描绘出裂痕,然后使用提取面命令分离这些面(执行Extract命令前KeepFacesTogether要先去掉勾选)。  @+ S# W& w: D& W" v( Z' R4 e
7 j1 E" ]1 ?7 @- m7 W
; J8 O3 C& u$ u- Z# P  l* d' x9 I

7 `8 f2 H1 I+ O0 v# c( v
) l( r+ }& [* |1 s: i9 Y) `1 {" M* w7 ]& d
(3)使用内核布料系统的布料切割,不过碎片会比较整齐。
7 l1 F; [( W8 X9 @(4)使用Dynamics动力学模块下Effects菜单的Shatter。此命令要求模型无历史,且材质不能太复杂,在圆弧表面的几何体上容易发生形变。
, }7 C9 I" K" m9 g(5)使用SplitVertex切分点工具。此命令会将点周围的边全部分离,与布料的切割类似。8 J) Q0 ]: v3 v5 w- e: `
(6)使用自定义的色块贴图,执行贴图转几何体命令(TextureToGeometry),然后提取面分离。这是最省事的方法,可控性也高,不过太复杂的贴图Maya会需要大量的运算时间。与BlastCode插件的破碎贴图有点类似。
5 s/ x) q3 c6 `4 S8 r+ R这里,我所进行的步骤如下:) j6 K' J' {9 n. j2 q* ]% v( k7 r+ _
(1)使用CutFacesTool将面片切割为几大块;9 X' R3 h2 K8 P) N  e3 l
: \, Y# y6 {1 g7 G+ m. E/ P

' J5 [; J% F8 B2 M* @# j1 Z(2)对撞击中心的区域模型进行细分操作:EditMesh->AddDivisions;
  z( R( x5 n2 [8 }
+ x8 \; i9 |& r) x" |+ A/ U6 |& S(3)删除所有碎片的历史,对细分后的碎片执行:Effects->CreateShatter(粉碎);' P# h7 W; B$ W# g* ~: O# O

! }- [! p3 o( d6 `# B, q( Q- W2 f4 `  }; d) j( e, |1 l- }
(4)全选整个墙体模型,执行Extrude(挤压)命令,制作出厚度;
9 P) w4 ~" i- ~ , }4 R6 d& |# ], \/ v! z) h6 L9 ^& ?

, F) y4 j5 P- c- A7 d6 i, r(5)全选整个墙体模型,执行Combine(合并)命令,合并为一个物体以方便编辑UV;9 v& C9 J) {& K$ A* _2 d& U

* s* h) }9 [3 S9 G* d+ k
# o8 j' o" J& R3 i(6)选择这个合并后的模型,使用一个平面的UV贴图投射PlanarMapping(如果也需要对模型的厚度进行单独UV展开,可以在侧视图选择这些模型面后进行AutomaticMapping);
3 @9 l# s% }5 k5 {
5 J6 J/ \& b+ z
/ ^: ^; N* p4 p" V(7)选择模型,执行Separate(分离),再次将模型分离为独立的小块,然后删除所有历史。( F3 h- C) b) i& C
& Q* `) q2 N; W' R7 k* G
! p& t8 s: h2 B$ H
(8)除了删除操作历史,冻结坐标(FreezeTransformations)和轴心居中(CenterPivot)也是很重要的操作。如果你在执行刚体解算时发生异常(如碰撞后刚体方向,旋转或大小很不合理的变化),那么最大的可能就是刚体物体或者其所在的组的变形属性(位置,旋转,缩放)的初始态有数值变化。
) a2 O) B( Y& z$ ] 5 x! p. {) x8 ^; a

" a* ~: Z+ |$ B(9)赋予模型贴图。与常规的模型贴图是一样的,没太多需要说明的,不过要注意的一点就是:由于是会产生动力学动画的物体,因此不可使用3D纹理节点进行贴图(谁用谁知道……)。
1 E( P3 w8 G" ] 4 u' R# B( G' S4 K4 v+ x: C

/ }& L# N8 _( U6 ~  G) Q% I4 I/ O1 T/ i4 o  O6 K% p
2.其他场景物体。斜坡,地平面,小车,大铁球。6 {  |# {' O$ M8 {9 G% Z* v

4 I0 C, ?* @2 _; z! ]$ c
! _' a  ~3 c* E2 @4 o; V3.制作包裹物体(刚体代理)。刚体的模拟是很耗费资源的,尤其是过于复杂的模型。配合分层渲染,我们应尽可能的优化刚体的解算。包裹物体就是参考复杂模型的基本外观,制作出一个简单的多边形几何体;将复杂模型作为包裹物体的子物体,然后在渲染的时候排除包裹物体(方法很多,最简单的就是将该包裹物体放于物体层中,设置层选项为Template参考模式-T字母标志;不过如果使用的是MentalRay渲染,就需要使用渲染过滤,因为MR不支持参考模式的层设置)。
: m, A% H! O9 J
7 O+ h0 L0 K+ g9 |, F) T7 y, d- u0 S8 j7 p
4.赋予包裹物体刚体属性。
- Y- q! ^5 u' M8 q8 k ! W/ _' M4 L5 e' k! ]

) b. t9 V; W3 B包裹物体刚体属性参数设置如下:
$ N- W7 n" C- H& D" ~! u* s1 yInitialVelocityZ(Z轴向的初速度):-20(负号表示朝Z轴的相反方向运动)
( E0 L$ L  i! H8 n6 kImpulseZ(Z轴向的推力):-10(抵消部分总摩擦力)
5 ]! g7 G. J5 o" ^/ Z5 m! B! jMass(质量):500% Q7 g/ L4 d6 Y- r! O: a
Bounciness(弹性):0.3
. A4 `. w* N& j1 G" \; f6 t ) W& Z4 T; F# Q' l( D
5.动力场连接。选择车的包裹物体,执行Fields->Gravity,将重力场增加至刚体解算中。
' r5 B5 ?4 D& `. D   [  i* o) B* u6 }& n, j+ }
; H  l, P0 {! v( _' ^6 `' K
6.对地面创建被动刚体。
  _! ~+ f* |- `% k2 R , D8 l6 l4 d1 R6 k$ l
& V2 P6 `& D+ V( c9 {$ @$ C
7.刚体约束。选择墙壁后的球体,执行CreateNailConstraint(创建钉子约束)。创建约束或动力场连接时,Maya会自动将几何体转为刚体属性,所以可以跳过赋予刚体属性的步骤。) v$ l- T6 L$ @5 [/ X
球体刚体属性参数设置如下:$ B* I% h% r4 d1 M% C5 v" }# A
Mass(质量):1000
" }" P4 w; H7 @9 V. w7 N; jBounciness(弹性):0.13 |% F! m+ ?& O1 k  N
* P2 h  D7 s5 K! R2 ~$ [
' i& Y1 f( J7 k- `4 J( ~& ^& B
8.设定初始位置。可以使用风场将球体吹至一定高度后,再将此位置的球体设置为初始态InitialState;这里我使用一个NURBS曲线圆圈进行定位,直接移动球体的位置(钉子约束点位置不变)。
/ }( B/ m) b" d+ B& }9 |  ]( @
5 {. q$ q/ s0 y+ A% v' O! R+ M$ ~! g& d& n% x5 |, J% c
9.手动将刚体与场景中已存在的动力场进行连接。选择球体,执行Window->RelationshipEditors->DynamicRelationships(动力学关系编辑器),点击Fields栏下的GravityField,当文字背景为默认的橙色时表示所选物体已经受重力场的影响。
, q6 x4 [- \1 Q7 p" y # {& R0 R  F, J7 W7 S
       & ?4 U2 h* o9 K# S7 N" n4 P
+ s/ S; L# j, d. m8 n" ]

' D2 i5 n# b3 I* C3 J10. 测试场景。为使小球穿过墙体撞击小车,根据需要改变小车的初速度或推力。因为总摩擦力与小车的质量有关,因此初速度的能量消耗程度取决于物体质量和摩擦因数的大小。
9 t3 P  j. s4 e+ a7 Y/ } % |  j; e3 p% [/ k

2 T. A' I; ?3 O  ]11.墙壁刚体的制作――由于墙壁有较多的碎片小块,因此我将它留到最后再制作。全选墙壁物体,执行CreateActiveRigidBody。此时最好不要播放场景动画,因为基本上都会卡机,甚至Maya崩溃。
3 E+ v2 ]8 _# [, S* Y解决方案(任选其一):
: h3 V& l+ {: q7 {" O(1)缩小所有刚体,使它们之间具有一定间隔,并修改刚体解算器下的参数值-步长和碰撞容差。( j% ]  b! e0 U: G/ z  G' ^
(2)设置刚体代理-方体和球体,降低解算质量。
/ e5 {$ Q1 ?. R9 i; A3 ~9 e7 A, ](3)设置碰撞层。
4 c4 E' ~2 @3 O0 X8 F! J# U3 C" B(4)设置穿插属性。
( Q$ L( I( K+ e$ h3 `如果撞击发生在很短的一瞬间,且镜头上不会过多的停留在碎片的飞行中,那么可以使用方案(4),这是快速实现效果的最优选择;
$ c+ T' i: X* }" E; W  H# k如果镜头不会停留在撞击点上(或者距离较远,可以忽略模型块的间距),我们可以使用方案(1),这可以较为完美的实现碎片飞行中的碰撞;3 _: a' X, R% g  \5 M" J/ G0 s
如果碎片较为规则,接近于方体,可使用方案(2)刚体代理来完成;) o* Q5 j) e2 e0 V; s
如果你需要对不同区域的碎片进行碰撞设置,方案(3)则可以考虑,我们可以将之理解为方案(4)的扩展。
- H1 z5 ^# c/ k; \: s: U$ f有时由于一些画面视觉的要求,我们需要同时将多种方案应用于一个场景动画中,但往往还是难以达到理想的动力学解算效果。此时,我们可以对个别物体的烘焙关键帧进行细节动画的调整;如果工作量太大,对碎片进行分层渲染来避免穿插镜头也是可以考虑的。- Y4 a. L9 R' Q; N* X6 x

! Y- q# k8 _" V6 `4 ^$ _12.选择方案(4)进行。一般撞击后飞行的碎片之间的碰撞不会太多,这里我直接忽略(谁叫我使用的是一个过时了的笔记本……效率优先),遇到穿插时我更倾向于对烘焙了关键帧的物体进行个别处理。, U  m) y) `7 c$ b1 n. Q
(1)全选墙壁的各刚体几何体,执行CreateActiveRigidBody;/ m2 W3 {7 N, z, d

, E3 E% a0 p! [& u* ^$ P$ X% E
- c# [+ }2 g7 S(2)保持刚体全选,点击右边通道栏SHAPES下的RigidBody节点,展开属性列表,直接修改参数值如下(所有选择物体的相同属性都会被同时修改):
$ j) T5 J4 c1 M9 l  }4 [# U: LMass(质量):203 A9 B7 B; Y3 _, s6 N/ K
Bounciness(弹性):0.1
' k1 T8 ]0 E' t0 CStandIn(替代):Cube(为了正确解算,最后我还是设为了None)! K, _! X$ h, {8 M$ W4 K

' K% H, \$ @5 X: u* B# c1 r' Z% i6 M- `& T. Q3 P# d
(3)保持刚体全选,执行Solvers->SetRigidBodyInterpenetration(设置刚体穿插);
6 K3 U! ?- t5 y4 J5 r! O
, I, o0 e$ d1 i& Z
# O7 ]9 ], g; [. i/ t8 V(4)选择最下面的几何体,将通道栏中的Active改为Off(输入0,回车即可)。
- g4 o" O! |! e2 Q9 _& s因为底部几何体不参与动力学解算,此步操作将所选几何体变为被动刚体,可避免它们与被动刚体地面的穿插(或者你也可以将它们与地面设置刚体穿插)-被动刚体间不会出现解算穿插的问题。5 ^3 a- \. N( t! D# l' q
1 I3 P! T# n! Q

3 T3 ]% K1 m% b/ t: x) v0 k(5)设置了刚体间的穿插,可以获得流畅的动力学解算效果,并且除了刚体碎片间的碰撞,它们与场景中其他刚体的碰撞还是会被真实的解算出来。如果仍打算将解算质量降到最低来提高解算速度,可以将所选刚体的通道栏的StandIn设置为Cube,并将刚体解算器RigidSolver节点的StepSize(步长)和CollisionTolerance(碰撞容差)数值提高,而RigidSolverMethods设置为MidPoint。
# f5 V9 ?  g% j, h7 h : z8 H% j3 P% C3 a9 V! ^
6 f8 `9 h; K# ~# s5 r( b
(6)播放场景动画进行测试。当动画达到预想效果,对墙体刚体设置重力场。
  p' i/ X! p  U! H9 l' b / X+ A* t- |2 v2 W# U1 _* `  A
; H0 F: ^: o/ q
在碎片被撞击飞出之前,我不打算让它受到重力场的作用而运动,因此我需要加入一个新的重力场,并对力场设置关键帧:将重力场的Magnitude(强度)设置为0;在发生撞击的那一帧设置关键帧(KeySelected),然后在下一帧更改Magnitude数值为9.8并设置关键帧。
* h; T4 a- }( T1 V9 p. Q+ w 8 z7 e& g/ C! N9 N1 X
8 Y9 `% v" Q( N2 R+ X6 M; {- v# J* D

  O2 z3 `) z) s3 b/ D& Z% k6 e6 {( j
2 X4 ~" L6 Z/ E+ z
  _- F6 m$ I0 e(7)选择那些不打算参与解算的模型,将它们通道栏的Ignore设置为On。
& O# T: K  n. A
: ?" _% l$ k! F1 w: D
  W  k  T  B, W1 N- G(8)播放动画,发现碰撞区的一些碎片与剩余的墙体发生穿插。
( f7 _+ I2 C7 ]* i ! V% x8 [4 H3 W- O7 Z! L3 s) M

4 P4 m7 V9 \) p$ A2 \8 @2 }9 |9 Q4 F8 s/ L% f; K# A% J
要解决这个问题,可以选择这些刚体,恢复它们的碰撞属性(SetRigidBodyCollision)――如果恢复的刚体太多,那又回到了设置穿插属性之前;根据镜头需要,常常需要进行分层渲染或调节烘焙关键帧来解决物体穿帮的镜头(华丽的特效是要慢慢磨出来的)。
( s' K; `  H5 ^$ o, E
$ T: l& L4 y. A5 o- \2 C, N2 f! ~& C9 \
(9)当动画效果基本达到,烘焙动力学模拟的关键帧(BakeSimulation),然后删除所有刚体属性。
* `5 H1 |- h' C, I6 H1 c*国际惯例,将关键帧的总长度压缩为一半左右。
+ R0 c. `& j& R/ l6 M
% t) U! `+ _) `' u5 D
4 _* p$ x5 v. W& I5 X
! c1 B: o" s( T4 Z13.设置镜头及灯光,渲染。当加入一些粒子特效(3D粒子或平面粒子)及碎片飞行的运动模糊,并在后期合成中完成震镜效果,一个很酷的撞击特效也就产生了。以下使用平面粒子软件ParticleIllusion素材中的一个简单烟效进行合成的效果演示。) {" N8 n/ |5 u0 [4 T

3 p0 _) A: d* c! A+ o$ u+ ?
) c( T4 F8 I; \  w3 M% y      
7 |  E5 Q: @- R, i) ]14.最终效果(太大图片网络观看会比较卡,因此设置为低质量的GIF图片)。
/ y' H0 z' Q/ o8 j- |# D % j3 f$ A  H; a' B% f% l. m
$ u. B0 L# z' a" G2 I
15.技术点总结:7 O7 O8 }! `2 O3 s' s: K8 p4 R
切割物体-设置刚体属性-添加力场和碰撞-设置刚体穿插-烘焙动力学关键帧
, x: u9 n2 J- j6 [
) B, @7 }3 W8 e

! y4 K9 m3 B& V; K9 ]+ G: k

评分

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

查看全部评分

B Color Smilies

全部评论3

你可能喜欢

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