Один из моих читателей (Шибанов Булат aka ASK'R) прислал мне свой шикарный урок по практическому применению скриптов в 3ds Max. Очень хорошо, что он его сделал так, как это происходит в жизни. Привожу тутор как есть.
Все картинки просто отмасштабированы. Чтобы увидеть полный размер, нажмите правой кнопкой мышки на неё и выберите пункт "Открыть изображение" (или подобный).
Поехали!
"Cлушай, парень, я ведь инженер, и умею решать проблемы."
— Инженер о себе
Team Fortress 2 © Valve
Задача или вводная.
Однажды мне понадобилось сделать модели многокоординатных машин в которых позиционирование частей осуществляется вращением шестерней по зубчатым рейкам. Шестерни были успешно созданы в каком-то бесплатном CAD пакете, а вот реек не нашлось.
Решение.
Вот так будет выглядеть конечный результат (если вы сделаете все шаги по этому уроку):
А дальше идёт процесс получения такого результата:
После некоторого гугления нашлась
Но это только сами зубья, а нужна рейка в целом. Значит каляка-малякаем ещё:
Теперь можно запустить макс и открыть редактор скрипта. И ничего пока не пишем! Просто жмем F1 и ищем spline, находим в результатах поиска SplineShape : Shape и открываем статью:
Выделенное это и есть то что надо - если получится сделать один отрезок, то и всю кривулину не составит проблемы.
Итак, чтобы сделать сплайн нам надо:
- Создать экземпляр в позиции какой-либо.
- Добавить в него хоть один сплайн.
- Добавить опорные точки.
- Обновить его (это фича для ускорения работы - всё создаем и только потом вываливаем в сцену, почти все объекты требуют обновления для появления в сцене).
- Возвращаем в вызывающий код для каких-либо дальнейших работ.
Кодирование.
Минимально необходимое знаем, можно писать код. Переносим с картинок код в MAXScript Editor:
-- \ - позволяет расписывать что-либо многострочно, это просто удобнее и нагляднее
-- for in конструкция позволяет пробежатся по всем элементам массива (не добавлять же узелки поштучно). И получаем однозубую рейку:
К тому же ещё и не замкнутую. Вспоминаем, что при создании вручную при достаточно близком расположении узелков, 3ds Max предлагает закрыть (Close) сплайн, значит умеет делать это сам (есть функция). Снова в поиск:
Добавляем close s 1
и теперь рейка годна для Extrude/Bevel.
Однако зубов у рейки может быть произвольное количество и негоже человеку работать. Значит думаем. Цикл нам позволит посчитать точки с нужными сдвигами, а joint (опять же из Maxscript Reference) позволит слепить кусочки:
Итак, в результате есть скрипт, который позволяет по цифрам построить рейку. На этом можно бы и остановится.
Однако, не все 3d artist'ы нормально воспринимают правку значений в тексте скрипта. Некоторые боятся его как огня *FUME_FX* и надо сделать чайники и полигоны GUI - Графический Пользовательский Интерфейс.
GUI-ня или "повернемся к пользователю лицом".
Использовать будем rollout и контролы на нём:
Понадобятся спиннеры для циферных значений и кнопка.
Из спиннеров будем получать значения и по нажатию кнопки создавать рейку.
Идея выглядит нормально, но в Максе принято иметь возможность посмотреть, покрутить параметры и только потом создать (вариант параметрического объекта пока не рассматривается - пользы немного, а заморочек существенно больше). Значит надо будет также обновлять рейку при изменении значения спиннера и показывать при настройке. Просто кнопка уже не подойдет, куда лучше будет зажимаемая - Check Button.
Пишем код попутно делая рефакторинг:
Теперь создание рейки спрятано за интерфейсом и заготовлены события, по которым будет что-либо происходить. При зажатии кнопки надо сделать рейку:
fillValues()
if state == on then (
generateRack()
)
generateRack()
)
если отжали, то надо её удалить:
else delete Rack
При изменениях в любом спиннере надо обновить её:
if Rack!=undefined and not isdeleted Rack then renewRack()
Итак, при зажатии кнопки видим зубчатую рейку во вьюпорте, можем крутить параметры, если отжали, то удаляется, если закрыли диалог рейка остается в сцене.
Итог.
В итоге получился Rack01.ms.
Возможно maxscript-гуру скажут фууу, поскольку очень многое не доделано и/или сделано грубой силой с копипастом. Но я считаю, что в этом и есть предназначение maxscript'а - делать не шедевры кода, а решать практические задачи (с проблемами "что есть добро?" должны разбираться долбаные философы).
GUI делался не для меня, а напарнику. Заняло всё около 3-х часов неторопливо с кофем и какавой. Этот скрипт можно засунуть в кнопку, можно сделать проверку единственности диалога, кнопку Create, чтобы не закрывать диалог, добавить подрезку зуба, эвольвентный профиль.
Распространение и применение, доработка одобряется. Авторство желательно упоминать.
Подпишитесь на обновление блога (вот 3 причины для этого).
Удачного скриптинга!
Кстати, бывают случаи, когда обучаться вместе с другими неловко или не эффективно, тогда сможет помочь частный репетитор, а найти всех репетиторов можно тут. Обучаться с ними можно как при личной встрече, так и по видеоконференции через скайп, к примеру.
Ах да! Это ведь не первый урок, который прислали мне читатели. До этого был видеоурок по сетапу собаки в Гудини. Так что если вам есть что сказать - присылайте на 3dyuriki@gmail.com.
И не забывайте заглядывать в мои социальные аккаунты (ссылки на них находятся в верхней правой части блога) за свежими 3D новостями.
P.S. Работа в начале статьи под названием "Жертва" сделана американцем в 3ds Max, BodyPaint, Digital Fusion, Photoshop, VRay и ZBrush. Оригинал
Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.
комментариев 12 к статье “Изучение MAXScript на практической задаче создания зубчатой рейки”
Извините, в данный момент комметарии закрыты.
Не хватает видео с результатом работы скрипта. )
Для того чтобы оценить скрипт/попробовать написать сам, не каждый захочет его скачивать.
Запишу. Когда? Не знаю.
Вот и обещанное видео:http://www.youtube.com/watch?v=pVPu8vo5YvI
2 yuriki: если возможно, то видео в начало статьи, а коммент в шредер 😉
Интересно посмотреть на поиски других людей, спасибо и автору статьи и автору блога.
На заметку. Довольно неудобно смотреть картинки в таком варианте. Много действий для открытия оной. Надо копировать ссылку и открывать в новой вкладке или открывать в этой вкладке а потом возвращаться назад. Даже скейл колесиком не помогает, так как ширина колонки на сайте не меняется. Лучше уж картинки будут гиперссылками на оригинал, или просто ссылками на открытие оригинала. Тогда можно будет колесиком просто на новой вкладке открывать.
Я просто беру и перетягиваю с помощью левой кнопки мышки изображение в поле вкладок/открытых страниц… Сразу же открывается изображение в полный размер… И быстро и удобно.
FireFox
О, а я и не догадался так сделать ))
Спасибо за подсказку!
Век живи, век учись…
это уже «высшая математика» какая то…сложно и непонятно
какая уж тут «высшая»? рулетка и прямоугольный треугольник (кстати тангенс на вики глянул — какой катет к какому).. прекращайте боятся и попробуйте что-то у себя автоматизировать, если совсем вяло пойдет — пишите вопросы, постараюсь ответить.
Скриптовые языки на то и призваны чтобы оптимизировать работу, так, что учить их всегда стоит.
Для изучения написания сриптов статья интересная и познавательная. А если рассматривать конкретно зубчатую рейку, то я б её сделал в Autodesk Inventor, а потом сохранил бы в формате *.max, в данной программе такая возможность есть уже давно, как ни как Inventor и 3dMax теперь от одного разработчика софта — Autodesk. Есть конечно в этом способе свой минус — полигональная сетка не всегда корректная, но это компенсируется скоростью, точностью и более широкими настройками выполнения данной задачи.
Сделать в инвенторе, солиде или ещё какой САПР это действительно удобно и геометрию можно хоть и некрасивую, но существенно более навороченную получить. Но!
Autodesk Inventor локальная версия (рус) 97 558.86 руб. или подписка 20 905.47 руб./год
Для разового случая нет смысла. Также надо учесть сроки поставки купленного ПО — неделю сиську мять будут минимум.
Кстати, если САПР уже есть/нужна в хозяйстве можно сделать лишь одну секцию и ретоположить в максе уже, потом Tools->Array, саттачить и VertexWeld кинуть