python-2.7 - 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, each, query=True, 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, verts[i], transformValue=weightsList[i])
cmds.button("applyWeightsBtn",edit=True, 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 )
推荐阅读
- c++ - 尝试对对象和向量进行练习以及它们如何一起运行时出错
- python - 在 Julia 中使用点绘制球体
- php - 为什么在使用静态作用域时闭包与闭包类相关联?
- python - 为什么 print('%r' % 0 == 0) 打印 False?
- r - 向量化循环代码
- google-colaboratory - 将数据集直接从 Kaggle 下载到 GoogleColab
- javascript - 如何从服务器/ url 中提取 json 数据并设置为等于变量?
- database - 使用 Gorm 对表执行 Upsert - on conflict 错误
- amazon-web-services - 通过 CloudFormation 更改子网组替换实例?
- payment - 跟踪比特币交易