Otimize Modelos que Excedem os Limites do League
Reduza a quantidade de ossos e vértices de um modelo no Maya sem perder os pesos da skin nem a compatibilidade de exportação do League of Legends.
Este guia mostra como reduzir a quantidade de ossos e vértices de um modelo no Maya, preservando a maior parte dos pesos da skin.
Se você só quer fazer um model swap 3D e não pretende editar animações, pule para Reduzir a geometria da mesh.
1. Reduzir a quantidade de ossos
Use este script para transferir os pesos da skin de um ou mais ossos de origem para os ossos de destino correspondentes.
- Copie o bloco abaixo para o Script Editor do Maya.
- Substitua os nomes de exemplo em
source_jointsetarget_joints. Cada osso de origem precisa corresponder ao osso de destino na mesma posição da lista. - Selecione a mesh com bind e execute o script.
import maya.cmds as cmds
def transfer_weights_multi(source_joints, target_joints):
if len(source_joints) != len(target_joints):
cmds.error("Source and target joint lists must be the same length.")
# Get selected mesh
sel = cmds.ls(sl=True, type="transform")
if not sel:
cmds.error("Select the skinned mesh first.")
mesh = sel[0]
# Find skinCluster
skin_cluster = None
history = cmds.listHistory(mesh)
for node in history:
if cmds.nodeType(node) == "skinCluster":
skin_cluster = node
break
if not skin_cluster:
cmds.error("No skinCluster found on selected mesh.")
# Get all vertices once
verts = cmds.ls(mesh + ".vtx[*]", fl=True)
for source_joint, target_joint in zip(source_joints, target_joints):
# Ensure target joint is an influence
influences = cmds.skinCluster(skin_cluster, q=True, inf=True)
if target_joint not in influences:
cmds.skinCluster(skin_cluster, e=True, ai=target_joint, lw=False, wt=0)
for v in verts:
src_w = cmds.skinPercent(skin_cluster, v, q=True, t=source_joint)
if src_w > 0:
tgt_w = cmds.skinPercent(skin_cluster, v, q=True, t=target_joint)
cmds.skinPercent(
skin_cluster,
v,
tv=[
(target_joint, tgt_w + src_w),
(source_joint, 0)
]
)
print("Transferred weights from {} to {}".format(source_joint, target_joint))
print("All joint transfers complete.")
# ===== USAGE =====
# 1. Select the skinned mesh
# 2. Replace joint names below
source_joints = [
"_Bone_Hair045_L",
]
target_joints = [
"_Bone_Hair044_L",
]
transfer_weights_multi(source_joints, target_joints)Quando o script terminar, mova cada osso de origem. Ele não deve mais deformar a mesh. Mova também o osso de destino para confirmar que agora ele recebeu o peso transferido.
Um osso pode influenciar várias meshes. Selecione cada mesh afetada e execute o script de novo antes de remover esse osso.
O script transfere os pesos, mas não apaga os ossos. Primeiro processe todas as meshes afetadas. Depois confira os ossos descendentes de cada osso de origem e apague somente os que você confirmou que não são mais necessários.
Execute este script para conferir a quantidade total de ossos na cena:
import maya.cmds as cmds
# Find all joint nodes in the entire scene
joints = cmds.ls(type='joint') or []
print(f"Total Joints in Scene: {len(joints)}")
Se a quantidade ainda estiver acima do limite de exportação, repita a transferência com outro par seguro de ossos de origem e destino.
2. Separar meshes e copiar pesos da skin
- Selecione a mesh e pressione
Ctrl+Dpara duplicar ela. - Selecione o grupo duplicado e use Separate Mesh by Material na shelf do Lemon 3D.
- Selecione todas as meshes separadas do grupo e faça bind delas no SKL original. Nas opções de Bind Skin, escolha Closest Distance para ter o resultado mais rápido.
- Selecione a mesh original, depois uma mesh separada, e copie os pesos da skin. Repita para cada material.
- Divida o grupo da mesh em grupos menores. Arraste o SKL para cada grupo e exporte. Neste ponto, você pode remover qualquer material que não queira incluir.
- Abra uma cena nova no Maya e arraste de volta todos os arquivos SKL e SKN que você exportou.
3. Reduzir a geometria da mesh
Comece pela geometria que fica dentro das roupas do personagem. A câmera do League vista de cima normalmente não mostra isso no jogo.
- Selecione a mesh. Esconda as outras meshes para facilitar os próximos passos.
- Pressione
F11e clique duas vezes nas faces que você quer remover. - Segure o botão direito do mouse, arraste para baixo para atribuir um material novo e escolha qualquer material no menu.
- Abra o Hypershade e confirme o nome do novo material.
- Volte ao grupo da skin, exporte e importe de novo.
- Encontre o novo grupo de geometria ou material no Outliner. Faça o unbind da geometria indesejada da skin e apague ela.
Como alternativa, use a ferramenta Reduce do Maya para diminuir a qualidade da mesh e depois faça novamente o bind da mesh reduzida ao SKL original.
Se a cena exceder o limite de ossos, termine de reduzir a quantidade de ossos antes de separar ou exportar a mesh. Caso contrário, o modelo não poderá ser exportado. Para um model swap 3D simples que não altera animações, você pode ir direto para a seção 3.
