Created
June 2, 2020 16:19
-
-
Save loonghao/ec1d3f986b5f1c05af52e121bb239707 to your computer and use it in GitHub Desktop.
This file contains 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
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