#!/usr/bin/env python # -*- coding: utf-8 -*- """ 版权所有: 深圳时光科技有限公司 联系方式: q.100@qq.com 创建日期: 2024/04/17 """ import os import maya.cmds as cmds def sg_pose(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 = cmds.SGReadJson(f=json_file, t="object") for obj in objects: joint_name = cmds.SGReadJson(d=obj, k="joint", t="string")[0] if joint_name in pose_joints: pos = cmds.SGReadJson(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 = cmds.SGGetMeshes(m=index) if cmds.objExists(mesh): meshes.append(mesh) # 执行轴向修正和重置绑定姿势 cmds.SGSkinAmendAxis() cmds.SGBindPoseReset(meshes) # 如果直接运行此脚本 if __name__ == '__main__': pass