import maya.cmds as cmds1 X; w! q! ~$ g1 W
import random- ]2 \0 x: Q% ~5 ?
6 g4 l3 Q& O' F! l: P+ ~( a J" m6 pdef surfaceMaterial(obj, R, G, B):5 O- U$ N! t3 t
name = (obj + '_shardMaterial')
. M J+ b! z9 j5 n% d, h if ( cmds.objExists(name) == 0 ):3 b2 |, e4 y/ w4 ^6 D1 J, k
cmds.shadingNode( 'lambert', asShader = True, name = name )+ K- v A* E/ X! @6 ~3 K$ f
cmds.sets( renderable = True, noSurfaceShader = True, empty = True, name = (name + 'SG'))% J' f: A! M X0 B3 |
cmds.connectAttr( (name + '.outColor'), (name + 'SG.surfaceShader'), force = True)" v3 ]& l3 y, Q, {
cmds.setAttr((name + '.color'), R, G, B, type = "double3")
7 _% h" y# m4 Q# k( ] return name4 l& r7 E- c$ c3 f; P: B+ l p
/ P$ c1 J4 y. y9 M+ M
def voroShatter(object, num):& ?3 {6 d% d! k6 f/ i: ] j
# Evaluate the bounding box points [minX, minY, minZ, maxX, maxY, maxZ], e8 b4 j7 t- x5 f
bbPoints = cmds.exactWorldBoundingBox(object) 0 I/ D, }, h8 @7 z- |" b, ^
print bbPoints
0 r! W: p' D) P- I 9 W* G+ X- F# r, H
# Place the random points for polycut, based on the bounding box: T- Q, m- t- ]8 }1 J% p
numPoints = num
' Q3 u/ r( @3 T; ] voroX = [random.uniform(bbPoints[0], bbPoints[3]) for i in range(numPoints)]" W2 ^, S* l$ c- e1 w% h; p9 Q- c
voroY = [random.uniform(bbPoints[1], bbPoints[4]) for i in range(numPoints)]7 V1 P7 z+ J4 S6 M$ u+ ^/ i6 T1 ]% C
voroZ = [random.uniform(bbPoints[2], bbPoints[5]) for i in range(numPoints)]% S, r/ \' o, ^! t! V; K# l5 t
voroPoints = zip(voroX, voroY, voroZ)
5 {4 P$ t5 P' K& d) N) I
. K! z0 Y% D. O2 v cmds.setAttr(object+'.visibility',0)5 x: |* l& y$ x4 i
chunksGrp = cmds.group( em=True, name = object + '_chunks_1' )7 ]# L3 r4 I0 o0 U0 |# G/ S
9 }* V/ U5 C1 d0 [! n; q
cmds.progressWindow(title = "Voronoi Calculating", progress = 0, isInterruptable = True, maxValue = numPoints)
( k/ x$ R# |* @ n( o" t2 g$ }0 i cmds.undoInfo(state = False)* U+ n* N" H' X
cmds.setAttr( str(object) + '.visibility' , 0)
& m& b! X, Q i. d- Q# Y8 | step = 0
2 {6 k7 P \- I3 J; W; \7 P* Q
7 @# @7 P5 u2 g% P E for voroFrom in voroPoints:8 j. l$ x7 k9 {% }4 y$ M' v
if cmds.progressWindow(q=True, isCancelled=True ): break; U3 Y3 S! N: _/ k
if cmds.progressWindow(q=True, progress=True ) >= numPoints: break4 e+ U! U8 V0 l6 f9 N( P) ?+ v( ~! J
step = step + 1
3 d9 F3 m& _% L" K
5 F s% {! D- E+ ` cmds.progressWindow( edit=True, progress=step, status=("Shattering step %d of %d completed..." % (step, numPoints)) )
" W7 {- h: V* E cmds.refresh(). o8 W2 `. Z) k: H S2 S7 |1 G
) `) k8 v: \8 j5 {+ y! f # Duplicate the object to cut as shatters
# h/ }9 z3 @# t- S; C workingObj = cmds.duplicate(object)8 S J4 I9 o+ O" n$ Z
cmds.setAttr(str(workingObj[0])+'.visibility',1)! s$ T6 d. s4 n, r9 f
cmds.parent(workingObj, chunksGrp)' {/ h( a# O1 D) c0 u
9 {, K2 {+ V: j: ?
for voroTo in voroPoints:
$ b* E8 N& J9 v/ x/ o9 w+ e if voroFrom != voroTo:
& C) z" i, K2 P3 F& E# i. T8 |+ z # Calculate the Perpendicular Bisector Plane- D! n- m: B% p3 Z
aim = [(vec1-vec2) for (vec1,vec2) in zip(voroFrom,voroTo)]( K8 p1 P" c" p9 P! F
voroCenter = [(vec1 + vec2)/2 for (vec1,vec2) in zip(voroTo,voroFrom)]/ L2 ?) D n5 G6 s- D; O G1 C
planeAngle = cmds.angleBetween( euler=True, v1=[0,0,1], v2=aim )- j# A: _4 d2 U& D! _5 M
# Bullet Shatter
% }' s# @& C# b cmds.polyCut(workingObj[0], df=True, cutPlaneCenter = voroCenter, cutPlaneRotate = planeAngle)2 ]% G4 ^2 f8 w" @/ J( _4 P2 D/ r
) b0 C0 X. C# T' R. q/ |
# Applying the material to the cut faces
( E% I' D# n, Z* k! s8 ~0 { oriFaces = cmds.polyEvaluate(workingObj[0], face=True)# X" ~; M8 F# v3 e, L- J, q
cmds.polyCloseBorder(workingObj[0], ch=False)! K; T; s* y7 K( ~$ u
aftFaces = cmds.polyEvaluate(workingObj[0], face=True)' C5 p( a/ v1 e2 n$ M8 [
newFaces = aftFaces - oriFaces
: V8 F5 O* T2 P" c , M/ u' b! D, w$ J
v6 e" `: y0 k! _6 | cutFaces = ( '%s.f[ %d ]' % (workingObj[0], (aftFaces + newFaces - 1)))' L0 U q1 V. o) }
cmds.sets(cutFaces, forceElement = (surfaceMat + 'SG'), e=True)' w7 `# E; H6 F' N% O6 R2 P+ g4 D
7 y6 x3 {; B8 r: W
a: A* F* I) v$ z. a cmds.xform(workingObj, cp=True)# T. w2 C# a3 m( b) l3 g1 A8 K
print str(workingObj)
' W" G. k2 N0 {6 l: t% i
, B3 z. w) N! S% E8 w" r cmds.xform(chunksGrp, cp=True)" h9 d/ v! Z9 k+ t8 b9 X5 W
cmds.progressWindow(endProgress=1)- ~* n2 ^ J7 m: c
cmds.undoInfo(state = True)
' E6 N' V5 g# M
, x' v0 g; v# Fselected = cmds.ls(sl=True, transforms=True)
3 x+ ~7 G; G+ t# j" ^. Z! Wfor sel in selected:# f& k: F1 m3 Y; W( m: y
surfaceMat = surfaceMaterial(sel, 0.5, 0.5, 1)! w8 _* r r7 R" p/ c# Q4 ~
voroShatter(sel, 10)