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

81 lines
3.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import maya.cmds as cmds
import re
from Core import GetMeshes, GetBlendShapes, ProgressBar, SetBlendShapes
def batch_add_blend_shape(lod, meshes):
"""
批量为指定LOD级别的模型添加混合变形目标
参数:
lod (int): LOD级别
meshes (list): 要处理的网格体名称列表
"""
# 获取指定LOD级别的所有网格体索引
mesh_indices = GetMeshes(lod=lod)
# 开始进度条
ProgressBar(sp=True)
for mesh_index in mesh_indices:
mesh = GetMeshes(m=mesh_index)
if cmds.objExists(mesh):
lod_mesh = GetMeshes(i=mesh_index)
# 使用正则表达式匹配第一个下划线前的内容
head = re.match(r'[^_]+', lod_mesh).group(0)
if head in meshes:
blend_shape = f"{lod_mesh}_blendShapes"
if not cmds.objExists(blend_shape):
# 创建混合变形节点
cmds.blendShape(mesh, automatic=True, name=blend_shape)
# 根据不同的模型类型处理不同的目标数量
target_count_map = {
"head": 0,
"teeth": 1,
"saliva": 1,
"eyeLeft": 3,
"eyeRight": 4,
"eyeshell": 8,
"eyelashes": 8,
"eyeEdge": 8,
"cartilage": 8
}
if head in target_count_map:
target_count = target_count_map[head]
count = GetBlendShapes(tc=target_count)
# 设置进度条
ProgressBar(max_value=count)
ProgressBar(t=f"[{blend_shape}] Creating Target Mesh...")
# 创建混合变形目标
for index in range(count):
ProgressBar(apr=1)
bs_name = GetBlendShapes(bsn=target_count, index=index)
# 复制网格体作为目标
cmds.duplicate(mesh, returnRootsOnly=True, name=bs_name)
# 对LOD0级别的特定模型设置混合变形目标
if lod == 0 and (head in ["head", "teeth", "cartilage"]):
SetBlendShapes(ct=mesh_index, index=index, target=bs_name)
# 添加混合变形目标
cmds.blendShape(
blend_shape,
edit=True,
tangentSpace=True,
target=(mesh, index, bs_name, 1.0),
weight=(index, 0)
)
# 删除临时目标模型
cmds.delete(bs_name)
# 结束进度条
ProgressBar(ep=True)