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

107 lines
3.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import maya.cmds as cmds
from Core import GetMeshes, ReadJson, SkinAmendAxis, BindPoseReset
def pose_character(pose):
"""
设置角色姿势
Args:
pose: 姿势名称
"""
# 获取当前坐标轴方向
axis = cmds.upAxis(q=True, ax=True)
# 定义需要处理的关节列表
pose_joints = [
"clavicle_r", "clavicle_l",
"upperarm_r", "upperarm_l",
"lowerarm_r", "lowerarm_l",
"hand_r", "hand_l",
"index_metacarpal_r", "index_metacarpal_l",
"index_01_r", "index_01_l",
"index_02_r", "index_02_l",
"middle_metacarpal_r", "middle_metacarpal_l",
"middle_01_r", "middle_01_l",
"middle_02_r", "middle_02_l",
"ring_metacarpal_r", "ring_metacarpal_l",
"ring_01_r", "ring_01_l",
"ring_02_r", "ring_02_l",
"pinky_metacarpal_r", "pinky_metacarpal_l",
"pinky_01_r", "pinky_01_l",
"pinky_02_r", "pinky_02_l"
]
# 创建临时定位器
locator = "MetaHumanLocatorTemp"
if not cmds.objExists(locator):
cmds.spaceLocator(n=locator)
locator_grp = "MetaHumanLocatorGrpTemp"
if not cmds.objExists(locator_grp):
cmds.group(em=True, n=locator_grp)
cmds.parent(locator, locator_grp)
# 读取关节数据
json_file = os.path.join(os.getenv("SG_PATH"), "files/data/BodyJoints.json")
objects = ReadJson(f=json_file, t="object")
for obj in objects:
joint_name = ReadJson(d=obj, k="joint", t="string")[0]
if joint_name in pose_joints:
pos = ReadJson(d=obj, k=pose, t="double")
joint_drv = f"{joint_name}_drv"
# 创建并删除父约束以获取位置
cmds.delete(
cmds.parentConstraint(
joint_drv,
locator,
skipRotate=["x", "y", "z"],
weight=1
)
)
# 根据坐标轴设置旋转
if axis == "y":
cmds.rotate(pos[0], pos[1], pos[2], locator, ws=True)
elif axis == "z":
cmds.setAttr(f"{locator_grp}.r", -90, 0, 0, type="float3")
cmds.rotate(pos[0], pos[1], pos[2], locator, ws=True)
cmds.setAttr(f"{locator_grp}.r", 0, 0, 0, type="float3")
# 创建并删除父约束以设置旋转
cmds.delete(
cmds.parentConstraint(
locator,
joint_drv,
skipTranslate=["x", "y", "z"],
weight=1
)
)
# 清理临时对象
cmds.delete(locator)
cmds.delete(locator_grp)
# 刷新视图
cmds.refresh()
# 处理网格
mesh_indices = [0, 9, 18, 26, 33, 38, 42, 46, 50, 51, 52, 53]
meshes = []
for index in mesh_indices:
mesh = GetMeshes(m=index)
if cmds.objExists(mesh):
meshes.append(mesh)
# 执行轴向修正和重置绑定姿势
SkinAmendAxis()
BindPoseReset(meshes)
# 如果直接运行此脚本
if __name__ == '__main__':
pass