
“Mirror Tool” для Maya: він створює компактне UI-вікно з кнопками дзеркалення меша по осях X/Y/Z (у + та − напрямках), додатково вміє кроково обертати виділені об’єкти (Shift+клік), має перемикач як позиціонувати mirror plane, налаштування Merge Threshold (для polyMergeVert), поле Rotate Step, і кнопку Clean щоб прибрати службові ноди після дзеркалення.
При старті k_mirrorToolStartUI() скрипт ініціалізує optionVar:
kk_switchMirrorPObject — режим позиціонування mirror plane (дефолт 2, тобто Object Center).k_MirrorOpton — значення для “Rotate Step” (дефолт 15 градусів). Зчитується у $valAng.Це дає “пам’ять” між запуском Maya: останній режим і кут збережуться.
Вгорі одна велика кнопка з іконкою, яка відображає поточний режим (World/Object/Pivot/Normals).
switchMirrorPMode() циклічно перемикає режим 1→2→3→4→1 і міняє іконку.popupMenu з пунктами, які напряму ставлять режим:switchMirrorPMode_menu1()...menu2()...menu3()...menu4()Далі 3 рядки по 2 кнопки:
mainMirrorCommand(1, 1) і mainMirrorCommand(1, 2)mainMirrorCommand(2, 3) і mainMirrorCommand(2, 4)mainMirrorCommand(3, 5) і mainMirrorCommand(3, 6)У кожної кнопки annotation:
Тобто одна й та сама кнопка робить різні дії залежно від модифікатора.
attrFieldSliderGrp mergeVertsValue — поле/слайдер для керування порогом злиття вершин у polyMergeVert.distance.
-en 0)K_MirrorMergeVert*, скрипт бере останню (ls -tail 1) і підключає атрибут .distance → тоді поле стає активним (-en 1)Є popup presets для швидких значень:
mergeTpreset_*() — вони просто роблять setAttr <mergeNode.distance> <value>.floatFieldGrp angleAdjust (1 поле):
k_MirrorOptonsaveCustomValue() і зберігає кут у optionVarЄ popup з пресетами: 1, 5, 10, 15, 30, 45, 90, 180.
Кнопка clearDoneButton → mirrorCleanAll()
switchMirrorPMode():
kk_switchMirrorPObjectswitchbuttonMirrorМеню-версії (switchMirrorPMode_menu1..4) роблять те саме, але без циклу.
setAllMirrorCommand() викликається одразу після polyMirrorCut і робить “порядок”:
listConnections -scn 1 збирає ноди, прибирає дублікати.mirroredCutMesh* → перейменовує в K_CustomMirror_ObjstransformGeometry*, через connections знаходить трансформ об’єкта → перейменовує в K_CustomMirror_OrgMmirrorCutPlane*useOutlinerColor + outlinerColorrenameSelectionList ("K_MirrorPlane_"); щоб plane мав читабельний префікс.Фактично ця процедура робить результат mirror “керованим”: імена стабільні, plane видно по кольору.
mainMirrorCommand(axis, rotatePlane)Функція має 2 режими: Mirror або Rotate, залежно від getModifiers.
Також вона:
kk_switchMirrorPObjectУмова: getModifiers == 0
Кроки:
manipMoveContext -q -p Move → $posPivot[]filterExpand -sm 12)manipRotateContext -q -orientAxes Rotate$rotValX/Y/ZhyperShade -smn "" (очистка?)ls -sl -mat → $getMaterialSymMirrors[]polyMirrorCut $mirrorCmdAxis 1 0.001;
$mirrorCmdAxis приходить як 1=X, 2=Y, 3=Z (базова вісь для інструмента)0.001 — схоже на merge threshold, але далі все одно знаходиться polyMergeVert і переназиваєтьсяsetAllMirrorCommand() — щоб перейменувати/пофарбувати службові ноди.rotatePlane робить поворот plane (не для всіх кнопок є повороти — деякі “empty”):polyMirrorCut вже підходить, або автор не захотів додаткових крутінь).$posPivot[axis]rotate -os -fo $rotValX $rotValY $rotValZ (орієнтація від маніпулятора)Object Center (2) окремо не обробляється — тобто це “дефолт”:
polyMirrorCutсам ставить plane в центр об’єкта.
9. Пошук і перейменування merge node:
polyMergeVert*K_MirrorMergeVertmergeVertsValue до .distance (і вмикає поле)10. Повертає матеріал на mirror result:
hyperShade -a $getMaterialSymMirrors11. В кінці:
Як підсумок: LMB створює mirror, робить plane “під контроль”, піднімає merge distance в UI і зберігає матеріал.
Умова: getModifiers == 1
angleAdjustrotate -ws -fo ...rotate -os -fo ... (тобто в object space)Фактично це “step rotate” — швидке підкручування об’єктів тим же набором кнопок.
mirrorCleanAll()Працює тільки якщо:
Дії:
DeleteHistory на результатіselect -r "K_MirrorPlane_*"; і через listConnections -d on підтягує пов’язані нодиdelete; — видаляє plane і пов’язані “службові” вузлиsource cleanUpScene.mel; deleteEmptyGroups();
Це кнопка “зроби чисто в Outliner після mirror”.
k_mirrorToolStartUI(); (в кінці скрипт робить це сам)MergeT (він активується після першого mirror)