вторник, 8 февраля 2011 г.

Инструмент масштабирования

Все мы знаем, что Maya это инструмент для создания инструментов.
Поделюсь с Вами своим изобретением. Возможно, кто-то тоже придумал себе, но я пишу от себя.

Зачем нужен: инструмент масштабирует объект относительно двух точек в пространстве по одной оси, если надо по 3 осям - то по 4 точкам (1 центр масштабирования и точки x, y, z).
Сама особенность этого инструмента, что можно задать расстояние от одной точки к другой. В отличии от стандартного Scale, где размеры в процентах 100%=1.

Создание инструмента продемонстрирую на свежеиспеченной фигуре.



Допустим нам надо задать фигуре конкретные размеры
40 см по длине на 9 см по высоте (и клиент строгий и схалтурить нельзя ).
Сразу мысли в голову: можно поставить в начало координат и отмасштабировать по сетке, но все равно присутствует погрешность, да и попасть на глаз мучительное занятие.

Вот предлагаю Вам решение:

Создаем габаритный контейнер из бокса, назначаем на него surfaceShader. Устанавливаем например желтый цвет на Out Color, out Transparency на половину.


Выставляем размер бокса смещая faces. Пользуясь разницей цветов.


Создаем Distance Tool и пользуясь привязкой к vertex “v” выставляем по углам габаритного контейнера.
Получаем размеры по оси X 45.646, по Z 12.347.
Обратите внимание, что 1 и 3 точка находятся в одном положении и автоматически сливаются в одну. Это такая особенность инструмента Distance Tool.
Выделяем бокс и размещаем Pivot в положении точки 1. (Зажимаем “d” + “v” + MMB разместив курсор на точке 1).
Зажатая клавиша “d” - режим управления pivot  пространстве.


Далее нам нужны конкретные размеры между маркерами Distance Tool, такие, чтобы могли сами задавать. Маркер 2 и 4 переносим иерархически под точку 1 (выделяем четкой последовательности: locator2, locator3, locator1 в Outliner и жмем “p”. Т.к. все выделенные объекты размещаются под последним выделенным объектом после нажатия “p”). Мы получим локальные координаты маркера 2 и 4 и можем в transform node им задавать координаты. А distanseDimaension (счетчик расстояния) будет показывать визуально такие же цифры.


А теперь свяжем положение маркеров с масштабом габаритного контейнера. Придется вспомнить школьные пропорции.
L1=S1
L2=S2
L1 расстояние между 1 и 2 точек по оси X, и 1 и 4 по оси Z, а это положение 2 и 4 маркера в локальных координатах маркера 1.
L2 расстояние, которое мы зададим этим маркерам.
S1 масштаб первоначальный габаритного контейнера
S2 масштаб который получим в результате смещения маркеров.
По правилам пропорции вычисляем S2=(L2*S1)/L1
В данном случае по оси X: S2=(L2*1) /-45.646 = L2/-45.646 (на знак минус не будем обращать внимание, нас интересует расстояние, а не положение в пространстве). И еще каждую пропорцию вычисляем отдельно для каждой координаты.
Теперь понятно, чтобы получить масштаб нам всего лишь надо провести деление и это должно быть интерактивно.
Открываем Hypershade, заходим в Create->General Utilities->Multiply Divide. Создается арифметическая нода.
Ставим переключатель Operation ->Divide
Смысл ноды-утилиты: верхняя строка делится нижней строкой и получаем output-значение.
L2 у нас интерактивное значение, изменяется от положения маркера в пространстве, L1 значение константа: X 45.646, по Z 12.347.


Начнем подключать ноды.
Для начал выведем все нужные ноды на поле Hyperhsade. Выделяем для начал locator1, locator2, locator3, GabaritContainer и multiplyDivide1, после жмем кнопку на панели Hypershade-> Input and output connections (две стрелочки). И сместим поле окна, сфокусировав на 5 нод.


Теперь создаем связи.
Нажимаем RMB (Right Mouse Button) на locator2.translateX потом тянем соединение на multiplyDivide1.input1X



В ноде multiplyDivide1 на панели attribute Editor появится связь.


Копируем в multiplyDivide1 значение Input 1 в Input 2. Т.к. мы еще не смещали маркеры то значения у них пока что одинаковые.
И создаем связь для координаты Z. Locator3.translateZ соединяем с multiplyDivide1.input1Z. Получаем картинку:


Вспоминаем пропорцию: S2=(L2*1)/L1, в данном случае получаем 1. Заранее проверьте масштаб вашего габаритного бокса, если вы поменяли масштаб, то назначьте на бокс команду Freeze transformation, для сброса размеров и получение Scale x 1, y 1, z 1.


Продолжаем создавать связи. Соединяем ноду-утилиту multiplyDivide1 с габаритным боксом.
multiplyDivide1.outputX -> GabaritContainer.scaleX
multiplyDivide1.outputZ -> GabaritContainer.scaleZ


Теперь сворачиваем Hypershade и попробуйте передвинуть маркер 2 и маркер 4. Габаритный бокс будем изменяться соответственно. Верните маркеры на место командой отмены действия.
Осталось самое простое присвойте фигуру к габаритному контейнеру. Выделите фигуру, контейнер и нажмите “p”.
Теперь фигура будет изменяться в размере под воздействием маркеров.
Заходим в трансформ ноду маркера 2, а потом 4. Там выставляем цифры положения в пространстве, соответственно заданным клиентом размеры: 40 и 9. Значит в locator2.transformX -40.000, locator3.transformZ 9.000.
Вот что получается:


Подытожим:
Создается данный инструмент за 2-3 минуты и избавляет вас от размеров «на глаз».
Этапы создания: контейнер, маркеры, нода-утилита, связи.

Данный инструмент можно назначать любым предметам: чертежам на плоскости, NURBS кривым взятых из векторной графики для основы построения зданий, да и вообще для любых объектов.
Надеюсь вам урок был доступен для всякого уровня знаний Maya. Если что непонятно - спрашивайте.

3 комментария:

3dyuriki комментирует...

Блин. Отличный урок. Спасибо.
Для меня, как для не очень посвященного пользователя Maya - это отличный тутор по использованию глубинных функций этого 3d-редактора.

Светлана Узких комментирует...

Спасибо за урок! Отлично!! :)

Максим комментирует...

Всегда пожалуйста :)

Отправить комментарий

Контакты: gmail mnexuss@gmail.com | ICQ 201882385 | Add me to Skype