cwisbg

# Seperate objects v2

Sep 14th, 2018
414
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.60 KB | None | 0 0
  1. # Seperate objects v2
  2. from pymel.core import*    
  3. import maya.api.OpenMaya as om
  4. import random as r
  5. import math
  6. class defAttr:
  7.     type = "2d"
  8.     stepSize = .01
  9.     itterAmnt  = 100
  10.     buffer = .5
  11.     smallInCenter = 1
  12. class thing():
  13.     def __init__(self, thingObject):
  14.         self.thingObj = thingObject
  15.         self.pos = om.MVector(thingObject.getTranslation())
  16.         self.lastPos = rVec(1)
  17.         self.dir = om.MVector.normalize(self.pos + rVec(.01))
  18.         bounds = xform(thingObject, bbi=1, q=1)
  19.         boundsMin = om.MVector(bounds[0],bounds[1],bounds[2]) + self.pos
  20.         boundsMax = om.MVector(bounds[3],bounds[4],bounds[5]) + self.pos
  21.         generalRadius = om.MVector(boundsMin - boundsMax)
  22.         self.radius = abs((generalRadius[0]+generalRadius[1]+generalRadius[2])/3)
  23.        
  24.        
  25. def getDist(p1,p2): # distance function
  26.     dist = math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
  27.     return dist  
  28. def rVec(randAmnt): # generates a random vector
  29.     if defAttr.type == "2d":
  30.         rV = om.MVector(r.uniform(-randAmnt,randAmnt),0,r.uniform(-randAmnt,randAmnt))
  31.     else:
  32.         rV = om.MVector(r.uniform(-randAmnt,randAmnt),r.uniform(-randAmnt,randAmnt),r.uniform(-randAmnt,randAmnt))
  33.     return rV
  34.    
  35.  
  36.          
  37. def seperateObjects(list):
  38.     for i in range(defAttr.itterAmnt):
  39.         currentTime(i, u=1)
  40.         for self in list:
  41.             sepCount = -1
  42.             sumS = om.MVector(0,0,0)
  43.             r.shuffle(list)
  44.             for thing in list:
  45.                  dist = getDist(self.pos, thing.pos)
  46.                  #print dist
  47.                  if dist == 0:
  48.                      pass
  49.                  if dist < thing.radius+self.radius * defAttr.buffer:
  50.                      diff = self.pos - thing.pos
  51.                      om.MVector.normalize(diff)  
  52.                      sumS += diff
  53.                      sepCount += 1
  54.                      
  55.                  if defAttr.type == "2d":
  56.                      diff = om.MVector(self.pos[0],0, self.pos[2]) - om.MVector(thing.pos[0],0,thing.pos[2])
  57.                  
  58.                      
  59.                      
  60.             if sepCount:    
  61.                 self.dir += om.MVector(sumS)#*thing.radius
  62.                 om.MVector.normalize(self.dir)
  63.                 self.dir *=  defAttr.stepSize # * abs(self.radius)
  64.                 #self.dir /= thing.radius
  65.                 self.pos += self.dir
  66.                 move(self.thingObj, self.pos)  
  67.                  
  68. sl = selected()
  69. slList = []
  70. for s in sl:
  71.     sepObj = thing(s)
  72.     slList.append(sepObj)
  73. seperateObjects(slList)
Advertisement
Add Comment
Please, Sign In to add comment