Skip to content

Instantly share code, notes, and snippets.

@nrtkbb
Created April 12, 2015 17:09
Show Gist options
  • Save nrtkbb/b56162215a6b95644eb2 to your computer and use it in GitHub Desktop.
Save nrtkbb/b56162215a6b95644eb2 to your computer and use it in GitHub Desktop.
2つのメッシュのバーテックスから、それぞれ一番近いやつを検索してきてフィットさせるやつ
# -*- coding: utf-8 -*-
import pymel.core as pm
import pymel.core.datatypes as dt
import threading
import multiprocessing
def isMesh(trans):
if type(trans.getShape()) == pm.nodetypes.Mesh:
return True
return False
def divide_selection_list(selection_list):
if 2 != len(selection_list):
raise Exception(u'Please select two mesh.')
(first, last) = selection_list[0], selection_list[1]
if not isMesh(first) or not isMesh(last):
raise Exception(u'Please select two mesh.')
return first, last
def getNearest(vectors, point):
nearest = vectors[0]
diff = vectors[0] - point
length = diff.length()
for v in vectors[1:]:
c = v - point
clength = c.length()
if clength < length:
nearest = v
length = clength
return nearest
def setNearest(vectors, vv, result):
for v in vv:
vec, vtx = v
nearest = getNearest(vectors, vec)
result.append((vtx, nearest))
def getVtxs(vtxs, count, i):
if i is 0:
return vtxs[:len(vtxs) / count]
if i is count - 1:
return vtxs[len(vtxs) / count * i:]
return vtxs[len(vtxs) / count * i:len(vtxs) / count * (i+1)]
def execute():
(first, last) = divide_selection_list(pm.ls(sl=True))
firstPosition = dt.Vector(pm.xform(first, query=True, worldSpace=True, translation=True))
lastPosition = dt.Vector(pm.xform(last, query=True, worldSpace=True, translation=True))
lastVtxsPositions = []
for v in last.getShape().vtx:
t = dt.Vector(pm.xform(v, query=True, worldSpace=True, translation=True))
lastVtxsPositions.append(t + lastPosition - firstPosition)
count = multiprocessing.cpu_count()
threads = []
result = []
for i in xrange(count):
vtxs = getVtxs(first.getShape().vtx, count, i)
vv = [(dt.Vector(pm.xform(v, query=True, worldSpace=True, translation=True)), v) for v in vtxs]
thread = threading.Thread(target=setNearest, name="thread{}".format(i), args=(lastVtxsPositions, vv, result))
print 'Start Thread{}'.format(i)
thread.start()
threads.append(thread)
for t in threads:
t.join()
for r in result:
v, nearest = r
nearest = nearest + firstPosition
pm.xform(v, worldSpace=True, translation=nearest)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment