MetaFusion/scripts/Reference/SGDefineJointForLOD.py

98 lines
2.8 KiB
Python
Raw Normal View History

2025-01-17 02:30:36 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
版权所有: 清泉时代科技有限公司
联系方式: q.100@qq.com
创建日期: 2024/02/23
"""
import maya.cmds as cmds
import maya.mel as mel
def sg_define_joint_for_lod(lod):
"""
为指定LOD级别定义关节设置
参数:
lod (int): LOD级别
"""
# 重置所有控制器的位移属性
controllers = [
# 嘴部控制器
"CTRL_C_mouth", "CTRL_C_tongue_wideNarrow", "CTRL_C_jaw",
"CTRL_C_jaw_fwdBack", "CTRL_L_mouth_pushPullU", "CTRL_R_mouth_pushPullU",
# ... (更多控制器)
]
# 重置所有控制器的X轴和Y轴位移
for ctrl in controllers:
try:
cmds.setAttr(f"{ctrl}.translateX", 0)
cmds.setAttr(f"{ctrl}.translateY", 0)
except:
continue
# 清除选择
cmds.select(clear=True)
# 处理RL4节点
exists = False
rl4_nodes = cmds.ls(type="embeddedNodeRL4")
if rl4_nodes:
exists = True
cmds.delete(rl4_nodes)
# 修复LOD 0的关节
mel.eval('SGRepairJointForLOD 0')
# 如果存在RL4节点重新创建
if exists:
dna = cmds.SGDescriptor(wd=True)
if cmds.file(dna, query=True, exists=True):
name = f"rl4Embedded_{cmds.SGDescriptor(n=True)}_rl"
mel.eval(f'SGCreateRL4Node "{dna}" "{name}"')
# 处理蒙皮和关节
mel.eval('SGFastUnbindSkinCluster')
mel.eval(f'SGRepairJointForLOD {lod}')
mel.eval(f'SGDeleteJointForLOD {lod}')
mel.eval('SGFastBindSkinCluster')
def _get_control_list():
"""
获取需要重置的控制器列表
返回:
list: 控制器名称列表
"""
return [
# 嘴部控制器
"CTRL_C_mouth", "CTRL_C_tongue_wideNarrow", "CTRL_C_jaw",
"CTRL_L_mouth_pushPullU", "CTRL_R_mouth_pushPullU",
"CTRL_L_mouth_pushPullD", "CTRL_R_mouth_pushPullD",
# 眼睛控制器
"CTRL_L_eye", "CTRL_R_eye", "CTRL_C_eye",
"CTRL_L_eye_blink", "CTRL_R_eye_blink",
# 眉毛控制器
"CTRL_L_brow_raiseIn", "CTRL_R_brow_raiseIn",
"CTRL_L_brow_raiseOut", "CTRL_R_brow_raiseOut",
# 下巴控制器
"CTRL_C_jaw_fwdBack", "CTRL_C_jaw_openExtreme",
# 舌头控制器
"CTRL_C_tongue_move", "CTRL_C_tongue_bendTwist",
"CTRL_C_tongue_tipMove", "CTRL_C_tongue_inOut",
# 其他面部控制器
"CTRL_L_nose", "CTRL_R_nose",
"CTRL_L_mouth_corner", "CTRL_R_mouth_corner",
"CTRL_L_mouth_stretch", "CTRL_R_mouth_stretch",
# 系统控制器
"CTRL_lookAtSwitch", "CTRL_convergenceSwitch",
"CTRL_faceGUIfollowHead", "CTRL_eyesAimFollowHead"
]