Как я за месяц написал свой AnimPicker
Как я за месяц написал свой AnimPicker (почти без опыта программирования)
Привет! Меня зовут Евгений, я аниматор с 15-летним стажем в Saber Interactive. И это история о том, как накопившееся раздражение от рабочего инструмента превратилось в собственный pet-проект.
Предыстория: почему вообще полез в код
Любой аниматор, работающий с персонажами в Maya, знает что такое пикер. Это такая панелька с кнопками, где нарисован силуэт персонажа и можно быстро выбирать нужные контролы не копаясь в Outliner. Кликнул по руке - выделилась рука. Очень удобно, экономит кучу времени.
Много лет я пользовался AnimSchoolPicker. Инструмент хороший, популярный, но со временем накопились претензии, которые начали реально мешать работе.
Проблема первая - лицензия. Раз в полгода она зачем-то слетает. И вот ты сидишь, у тебя горит дедлайн, открываешь Maya - а пикер требует ввести серийник. Окей, лезешь на сайт. Какой там был логин? А пароль? Потом ищешь в покупках этот ключ, копируешь, вставляешь... Минут 15 потерял на ровном месте. Мелочь? Когда это происходит регулярно - уже не мелочь.
Проблема вторая - нет Recent Files. Каждый раз, когда открываешь пикер, надо руками искать файл. А где он лежит? В папке проекта? В какой именно папке проекта - их штук двадцать? Может в документах? Это звучит глупо, но когда работаешь над несколькими проектами параллельно и у каждого свои пикеры для разных персонажей - поиск нужного файла превращается в квест.
Проблема третья - фоновая картинка. В оригинальном пикере изображение фона хранится отдельным файлом. Если картинка потерялась, переместилась, или кто-то почистил папку - всё, пикер превращается в набор кнопок на пустом фоне. Работать можно, но очень неудобно.
В какой-то момент я понял: хватит терпеть, надо что-то делать.
Решение: а напишу-ка свой!
Идея казалась безумной. Я аниматор, не программист. Максимум что писал на Python - простенькие скрипты для автоматизации рутины в Maya. Но последние полгода я увлёкся тем что сейчас называют "вайбкодинг" - программирование с помощью нейросетей. Ты объясняешь что хочешь получить, ИИ пишет код, ты тестируешь, находишь баги, снова объясняешь - и так по кругу.
Звучит как читерство? Может быть. Но результат работает, а я по ходу дела реально начал понимать Python, Qt, как устроены GUI-приложения. Это не замена обучению, это скорее очень интенсивный практический курс где ты сразу делаешь что-то настоящее.
Что получилось за месяц
Проект называется QuickAnimaPicker. Это не просто клон AnimSchoolPicker - это инструмент, заточенный под мой личный workflow, который сложился за 15 лет работы.
Главные фичи которыми горжусь:
Recent Files - наконец-то! Открыл пикер, File → Recent Tabs, вот они все твои последние файлы. Два клика вместо минуты поисков.
Картинка внутри файла - фон сохраняется прямо в .picker файл. Потерять невозможно. Переслал коллеге файл - у него всё работает, ничего не надо искать.
Вставка фона из буфера обмена - это вообще киллер-фича для меня. Делаешь скриншот viewport'а (Win+Shift+S), переключаешься в пикер, Ctrl+Shift+V - готово, фон на месте. Никаких "сохранить картинку, найти картинку, загрузить картинку".
Smart Insert - выделяешь контролы в Maya, жмёшь Ctrl+I, и кнопки создаются автоматически в тех местах экрана где находятся эти контролы. То есть буквально: сделал скриншот персонажа, вставил как фон, выделил все контролы, Ctrl+I - и у тебя готовый пикер за минуту.
Paste Background from Clipboard
Вставить изображение из буфера обмена как фон. Удобно делать фон из скриншотов
Умная вставка — создаёт кнопки из выделенных объектов Maya, располагая их на canvas в соответствии с экранными позициями объектов во viewport. Идеально для быстрого создания пикера по скриншоту персонажа. Экономит тонну времени. В один клик можно создать все кнопки для выделенных костей в правильных позициях.
Hierarchy Scale Decay...
Настроить коэффициент уменьшения размера для дочерних кнопок в иерархии (1.0 = без изменений, 0.5 = каждый уровень в 2 раза меньше)
Даблклик по родителю - выделяет ассоциированные кнопки потомков
Технические детали (для тех кому интересно)
• Python 2.7 / 3.x (работает в Maya 2019-2026)
• PySide2 / Qt для интерфейса
• Данные хранятся в JSON
• Картинки кодируются в base64 и встраиваются в файл
• Около 5000 строк кода
Самое сложное было - заставить всё это стабильно работать в Maya. Qt-окна внутри Maya это отдельный вид боли. Они могут крашить программу при закрытии, могут оставаться в памяти как "зомби", могут конфликтовать с другими плагинами. Отлавливание таких багов заняло больше времени чем написание основного функционала.
Текущий статус
Продукт почти готов. Сейчас я им активно пользуюсь в повседневной работе - это лучший способ найти баги, когда инструмент проходит проверку боем в реальных условиях.
Планирую ещё погонять его пару месяцев, убедиться что всё стабильно, и тогда, возможно, выложу в открытый доступ. Бесплатно, разумеется - я делал это для себя, но если кому-то ещё пригодится, буду только рад.
Что понял в процессе
Раздражение - хороший мотиватор. Если инструмент бесит достаточно долго, это может дать энергию написать свой.
Вайбкодинг работает. Да, это не классическое программирование. Да, иногда получается "код Франкенштейна". Но для создания рабочего инструмента под свои нужды - вполне рабочий подход. А понимание приходит по ходу дела.
Свой инструмент > чужой инструмент. Даже если чужой объективно мощнее. Потому что свой ты можешь подстроить под себя, а не подстраиваться под него.
20+ лет опыта в профессии это не просто стаж. Это понимание что именно тебе нужно от инструмента. Без этого понимания я бы написал очередной клон. А так получилась штука которая решает мои конкретные проблемы.
________________________________________
Если есть вопросы по проекту или хотите узнать когда будет релиз - пишите в комментариях.
P.S. Да, в титрах некоторых игр Saber Interactive можете найти моё имя в разделе Animation. Но над чем работаю сейчас - NDA, сами понимаете.
Евгений Мельников. Аниматор Saber Interactive.