Skip to content

Instantly share code, notes, and snippets.

@taikomatsu
Created June 22, 2015 07:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save taikomatsu/99d34488eebe0225510f to your computer and use it in GitHub Desktop.
Save taikomatsu/99d34488eebe0225510f to your computer and use it in GitHub Desktop.
Stick to closest uv
from maya import OpenMaya
from pymel.core import *
import math
class UvCoord(object):
def __init__(self, u, v):
self.u = u
self.v = v
def dist(self, uv):
du = self.u - uv.u
dv = self.v - uv.v
return math.sqrt(du * du + dv * dv)
def mfnmesh_from_objname(name, extend_to_shape=False):
if not objExists(name):
raise MayaNodeError, name
slist = OpenMaya.MSelectionList()
slist.add(name)
dagpath = OpenMaya.MDagPath()
slist.getDagPath(0, dagpath)
if extend_to_shape:
dagpath.extendToShape()
return OpenMaya.MFnMesh(dagpath), dagpath
def get_uv(meshfn):
us = OpenMaya.MFloatArray()
vs = OpenMaya.MFloatArray()
meshfn.getUVs(us, vs)
uvs = []
for i in range(us.length()):
uvs.append(UvCoord(us[i], vs[i]))
return uvs
def set_uv(meshfn, uvs):
us = OpenMaya.MFloatArray()
vs = OpenMaya.MFloatArray()
for uv in uvs:
us.append(uv.u)
vs.append(uv.v)
meshfn.setUVs(us, vs)
def transfer_uv(src, dst):
srcmesh_fn, srcmesh = mfnmesh_from_objname(src)
dstmesh_fn, dstmesh = mfnmesh_from_objname(dst)
src_uvs = get_uv(srcmesh_fn)
dst_uvs = get_uv(dstmesh_fn)
uvs = []
for duv in dst_uvs:
closest_dist = 1.0
closest_id = -1
for i, suv in enumerate(src_uvs):
dist = duv.dist(suv)
if dist < closest_dist:
closest_dist = dist
closest_id = i
uvs.append(src_uvs[closest_id])
print len(uvs)
set_uv(dstmesh_fn, uvs)
# 総当りでuv同士の距離を全部測って一番近いポイントにくっつける
transfer_uv('objA', 'objB')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment