Optymalizacja modeli przekraczających limity League
Zmniejsz liczbę kości i wierzchołków modelu w Mayi, zachowując wagi skina oraz zgodność z eksportem do League of Legends.
Ten poradnik pokaże ci, jak zmniejszyć liczbę kości i wierzchołków modelu w Mayi, zachowując większość wag skina.
Jeśli chcesz tylko podmienić model 3D i nie planujesz edytować animacji, przejdź od razu do sekcji Zredukuj geometrię mesha.
1. Zmniejsz liczbę kości
Użyj tego skryptu, żeby przenieść wagi skina z jednej lub kilku kości źródłowych na odpowiadające im kości docelowe.
- Skopiuj poniższy blok do Script Editora w Mayi.
- Zastąp przykładowe nazwy w
source_jointsitarget_joints. Każda kość źródłowa musi odpowiadać kości docelowej na tej samej pozycji w drugiej liście. - Zaznacz zbindowany mesh i uruchom skrypt.
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)Po zakończeniu skryptu porusz każdą kością źródłową. Nie powinna już deformować mesha. Porusz też kością docelową, żeby potwierdzić, że przejęła przeniesione wagi.
Jedna kość może wpływać na kilka meshy. Zanim ją usuniesz, zaznacz każdy mesh, na który wpływa, i ponownie uruchom skrypt.
Skrypt przenosi wagi, ale nie usuwa kości. Najpierw przetwórz wszystkie meshe, na które wpływa dana kość. Potem sprawdź kości potomne każdej kości źródłowej i usuń tylko te kości, które na pewno nie są już potrzebne.
Uruchom ten skrypt, żeby sprawdzić łączną liczbę kości w scenie:
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)}")
Jeśli liczba nadal przekracza limit eksportu, powtórz przenoszenie dla innej bezpiecznej pary kości źródłowej i docelowej.
2. Rozdziel meshe i skopiuj wagi skina
- Zaznacz mesh i naciśnij
Ctrl+D, żeby go zduplikować. - Zaznacz zduplikowaną grupę, a potem wybierz Separate Mesh by Material na shelfie Lemon 3D.
- Zaznacz wszystkie rozdzielone meshe w grupie i zbinduj je z oryginalnym SKL. W opcjach Bind Skin wybierz Closest Distance, żeby najszybciej uzyskać wynik.
- Zaznacz oryginalny mesh, a potem jeden z rozdzielonych meshy, i skopiuj wagi skina. Powtórz to dla każdego materiału.
- Podziel grupę meshy na mniejsze grupy. Przeciągnij SKL do każdej z nich, a potem ją wyeksportuj. Na tym etapie możesz usunąć wszystkie materiały, których nie chcesz uwzględniać.
- Otwórz nową scenę w Mayi, a potem przeciągnij do niej wszystkie wyeksportowane pliki SKL i SKN.
3. Zredukuj geometrię mesha
Zacznij od geometrii wewnątrz ubrań postaci. Kamera League patrzy z góry, więc zwykle nie będzie jej widać w grze.
- Zaznacz mesh. Ukryj pozostałe meshe, żeby ułatwić sobie kolejne kroki.
- Naciśnij
F11, a potem kliknij dwukrotnie ścianki, które chcesz usunąć. - Przytrzymaj prawy przycisk myszy, przeciągnij w dół, żeby przypisać nowy materiał, i wybierz dowolny materiał z menu.
- Otwórz Hypershade i sprawdź nazwę nowego materiału.
- Wróć do grupy skina, wyeksportuj ją, a potem zaimportuj ponownie.
- Znajdź nową grupę geometrii lub materiału w Outlinerze. Odłącz niechcianą geometrię od skina, a potem ją usuń.
Możesz też użyć narzędzia Reduce w Mayi, żeby obniżyć jakość mesha, a potem zbindować zredukowany mesh z oryginalnym SKL.
Jeśli scena przekracza limit kości, dokończ zmniejszanie ich liczby, zanim rozdzielisz lub wyeksportujesz mesh. W przeciwnym razie modelu nie da się wyeksportować. Przy prostej podmianie modelu 3D bez zmian w animacjach możesz przejść od razu do sekcji 3.
