如何解决Maya:将顶点蒙皮权重复制粘贴到不同命名空间中的对象
我编写了一个简单的脚本,将顶点关节皮肤值存储在列表中并按选择顺序应用它们,但我需要将值从根命名空间中的对象存储,并将它们应用于不同命名空间中的对象,因为它有相同的关节名称。至少这是我的计划,但 IDK 如何正确地做到这一点。我看到了编辑该 weightsList 的可能性,但它让我感到害怕,因为关节名称位于列表中的列表中。
import maya.cmds as cmds
import pymel.core as pm
def getVertexWeights():
global weightsList
weightsList =[]
meshSkinCluster = ""
vertexWeightList =[]
# get all selected vetices in order
verts = cmds.ls(flatten = True,orderedSelection = True)
cmds.polyEvaluate( v=True)
# check is any vertex
if len(verts) == 0:
return cmds.error( "Please select vetices with skin weighs" )
else:
obj = cmds.ls(verts[0],objectsOnly = True)
history = cmds.listHistory(obj)
#get mesh skin cluster
for historyNode in history:
if cmds.nodeType(historyNode)=="skinCluster":
meshSkinCluster = historyNode
#get joint list
for each in verts:
#get weight values
skinVals = cmds.skinPercent(meshSkinCluster,each,query=True,value=True)
#get joints list which affect vetex
jointVals = cmds.skinPercent(meshSkinCluster,transform=None)
print jointVals
#clear list before creating child
vertexWeightList = []
for i in range(len(jointVals)):
#clear list every loop
childList =[]
#build list [jointName,weightValue]
childList.append(jointVals[i])
childList.append(skinVals[i])
#add values of each influenced joint to the list which will represent one vertex data
vertexWeightList.append(childList)
#add each vertexWeightList to the weightsList
weightsList.append(vertexWeightList)
cmds.button("applyWeightsBtn",edit=True,enable=True)
cmds.select(clear=True)
verts=[]
def setBorderWeights():
verts = cmds.ls(flatten = True,orderedSelection = True)
#check if anything selected
if len(verts) == 0:
return cmds.error( "Please select vetices with skin weighs" )
else:
obj = cmds.ls(verts[0],objectsOnly=True)
print obj
history = cmds.listHistory(obj)
#get mesh skin cluster
for historyNode in history:
if cmds.nodeType(historyNode)=="skinCluster":
meshSkinCluster = historyNode
#get namespace
objNamespace = pm.selected()[0].namespace()
print objNamespace
#if there is no namespace apply weight frome the stored list without changes
if objNamespace=='':
for i in range(len(verts)):
cmds.skinPercent( meshSkinCluster,verts[i],transformValue=weightsList[i])
print 'no namespace'
#apply weights from the stored list to selected vertice
else:
for i in range(len(verts)):
for j in range (len(weightsList[i])):
tempName = weightsList[i][j][0]
weightsList[i][j][0] = objNamespace+tempName
print weightsList[i][j][0]
for i in range(len(verts)):
cmds.skinPercent( meshSkinCluster,transformValue=weightsList[i])
cmds.button("applyWeightsBtn",enable=False)
cmds.select(clear=True)
verts=[]
def showUI():
if (cmds.window("TransferBorderWeights",exists=True)):
cmds.deleteUI("TransferBorderWeights")
myWin = cmds.window("TransferBorderWeights",title="Transfer border Weights",resizeToFitChildren=True,maximizeButton=False,widthHeight=(180,200))
cmds.columnLayout()
cmds.rowLayout(numberOfColumns=2)
cmds.button("storeWeightsBtn",label="Store Weights",enable=True,command="getVertexWeights()",width=150)
cmds.button("applyWeightsBtn",label="Apply Weights",enable=False,command="setBorderWeights()",width=150)
cmds.setParent("..")
cmds.showWindow(myWin)
showUI()
解决方法
脚本无法正常工作,因为未启用有序选择
cmds.selectPref( trackSelectionOrder=1 )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。