107 lines
3.2 KiB
Python
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 |