Created
June 22, 2015 07:25
-
-
Save taikomatsu/99d34488eebe0225510f to your computer and use it in GitHub Desktop.
Stick to closest uv
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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