Skip to content

Instantly share code, notes, and snippets.

@loonghao
Created June 2, 2020 16:19
Show Gist options
  • Save loonghao/ec1d3f986b5f1c05af52e121bb239707 to your computer and use it in GitHub Desktop.
Save loonghao/ec1d3f986b5f1c05af52e121bb239707 to your computer and use it in GitHub Desktop.
import pymel.core as pm
def getBuildOrder(face):
"""Returns the uvs of a face in the build order """
verts = []
vtxFaces = pm.ls(pm.polyListComponentConversion(face, toVertexFace=True), flatten=True)
for vtxFace in vtxFaces:
uvs = pm.polyListComponentConversion(vtxFace, fromVertexFace=True, toUV=True)
verts.append(uvs[0])
return verts
def getUVFaceNormal(face):
"""Returns the UV normals from face"""
uvs = getBuildOrder(face)
if len(uvs) < 3:
return 1, 0, 0
uvA_xyz = pm.polyEditUV(uvs[0], query=True, uValue=True, vValue=True)
uvB_xyz = pm.polyEditUV(uvs[1], query=True, uValue=True, vValue=True)
uvC_xyz = pm.polyEditUV(uvs[2], query=True, uValue=True, vValue=True)
uvAB = pm.dt.Vector([uvB_xyz[0]-uvA_xyz[0], uvB_xyz[1]-uvA_xyz[1], 0])
uvBC = pm.dt.Vector([uvC_xyz[0]-uvB_xyz[0], uvC_xyz[1]-uvB_xyz[1], 0])
uvNormal = uvAB.cross(uvBC)
uvNormal = uvNormal.normal()
return uvNormal
def findReversed(obj):
"""Returns meshes with normals pointing inward"""
reversed = []
faces = pm.polyListComponentConversion(obj, toFace=True)
faces = pm.ls(faces, flatten=True)
for face in faces:
uv_normal = getUVFaceNormal(face)
if (uv_normal * pm.dt.Vector([0, 0, 1])) < 0:
reversed.append(face)
return reversed
sel = pm.ls(type="mesh")
reversed_meshes = []
for object in sel:
pm.polyNormal(object, normalMode=2, userNormalMode=0, ch=1)
reversed = findReversed(object)
if reversed:
reversed_meshes.append(object)
print ("reversed meshes: " + str(reversed_meshes))
for mesh in reversed_meshes:
pm.polyNormal(mesh, normalMode=0, userNormalMode=0, ch=1)
pm.polySoftEdge(object, a=0, ch=1)
pm.polySoftEdge(object, a=180, ch=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment