MetaFusion/scripts/utils/BindPoseReset.py
2025-02-07 05:10:30 +08:00

105 lines
4.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import maya.cmds as cmds
import maya.mel as mel
from Core import get_orig_name, get_orig_shape_name, ProgressBar, GetBlendShape
def bind_pose_reset(objs):
"""
重置模型的绑定姿势
参数:
objs (list): 要处理的模型列表
"""
# 开始进度条
ProgressBar(sp=True)
ProgressBar(max_value=len(objs))
for obj in objs:
# 更新进度条
ProgressBar(t=f"[{obj}] Bind Pose Reset...")
ProgressBar(apr=1)
# 获取蒙皮变形节点
skin_cluster = mel.eval(f'findRelatedSkinCluster("{obj}")')
if cmds.objExists(skin_cluster):
# 获取混合变形节点
blend_shape = GetBlendShape(obj)
# 创建临时复制模型
copy_name = cmds.duplicate(obj, name=f"{obj}_CopyTarget", returnRootsOnly=True)
cmds.blendShape(copy_name[0])
cmds.delete(copy_name[0], constructionHistory=True)
# 获取骨骼并应用蒙皮
bones = cmds.skinCluster(skin_cluster, query=True, influence=True)
cmds.skinCluster(bones, copy_name[0], toSelectedBones=True)
# 复制蒙皮权重
cmds.copySkinWeights(
sourceShape=obj,
destinationShape=copy_name[0],
noMirror=True,
surfaceAssociation="closestPoint",
influenceAssociation=["closestJoint", "oneToOne"]
)
# 解绑原模型
cmds.skinCluster(obj, edit=True, unbind=True)
# 获取复制模型的形状节点
target_shape = cmds.pickWalk(copy_name[0], direction="down")
if cmds.objExists(blend_shape):
# 处理带有混合变形的情况
orig = get_orig_name(obj)
try:
cmds.connectAttr(f"{orig[0]}.outMesh", f"{blend_shape}.originalGeometry[0]", force=True)
cmds.connectAttr(f"{orig[0]}.worldMesh[0]", f"{blend_shape}.input[0].inputGeometry", force=True)
except: pass
cmds.currentTime(0)
cmds.connectAttr(f"{target_shape[0]}.outMesh", f"{orig[0]}.inMesh", force=True)
cmds.currentTime(1)
cmds.disconnectAttr(f"{target_shape[0]}.outMesh", f"{orig[0]}.inMesh")
cmds.currentTime(0)
else:
# 处理不带混合变形的情况
orig = get_orig_shape_name(obj)
if orig:
cmds.currentTime(0)
cmds.connectAttr(f"{target_shape[0]}.outMesh", f"{orig[0]}.inMesh", force=True)
cmds.currentTime(1)
cmds.disconnectAttr(f"{target_shape[0]}.outMesh", f"{orig[0]}.inMesh")
cmds.currentTime(0)
# 重置控制点位置
vertex_count = cmds.polyEvaluate(orig[0], vertex=True)
for i in range(vertex_count):
cmds.setAttr(f"{orig[0]}.controlPoints[{i}]", 0, 0, 0, type="float3")
else:
# 处理没有Orig节点的情况
still_shape = cmds.pickWalk(obj, direction="down")
cmds.currentTime(0)
cmds.connectAttr(f"{target_shape[0]}.outMesh", f"{still_shape[0]}.inMesh", force=True)
cmds.currentTime(1)
cmds.disconnectAttr(f"{target_shape[0]}.outMesh", f"{still_shape[0]}.inMesh")
cmds.currentTime(0)
# 重新绑定蒙皮并复制权重
cmds.skinCluster(bones, obj, name=skin_cluster, toSelectedBones=True)
cmds.copySkinWeights(
sourceShape=copy_name[0],
destinationShape=obj,
noMirror=True,
surfaceAssociation="closestPoint",
influenceAssociation=["closestJoint", "oneToOne"]
)
# 删除临时模型
cmds.delete(copy_name[0])
# 结束进度条
ProgressBar(ep=True)