Michel Anders - Написание скриптов для Blender 2.49
Небольшое отступление, или почему кролики связаны с подсолнухами.
Одна из вещей, которую Вы можете заметить - то, что мы разместили семена в специфической спирали. Этот тип спирали, где последующие позиции вдоль спирали расположены идующими с так называемым Золотым сечением, называется спираль Ферма (Fermat's spiral). Такой спиралью получается естественным образом во многих семенных головках, когда цветочки или семена формируются в середине и выталкиваются наружу, в результате получается очень рациональная (плотная) упаковка.
Когда мы увидели, размещение семян также кажется, следует за обоими левым и правым поворотами кривых. Количество этих кривых обычно является парой из последовательности Фибоначчи [ 1 1 2 3 5 8 13 21 ] и отношение такой пары чисел стремится сойтись в Золотом сечении, когда они становятся больше. (В двух иллюстрациях нашей семенной головы внизу мы можем различить 13 спиралей против часовой стрелки и 21 спираль по часовой стрелке.) Фибоначчи изобрёл эту серию в попытке моделирования роста населения кроликов. Больше о подсолнухах (и, возможно, кроликах), можно обнаружить здесь: http://en.wikipedia.org/wiki/Sunflower.
Итог
В этой главе мы увидели, как создавать сложные объекты, и как сделать задачу конфигурирования этих объектов легкой для конечного пользователя, предоставив графический интерфейс, который помнит предыдущие настройки. Мы также увидели, что можно привлечь Блендер, как инструмент командной строки, для автоматизации часто выполняемых задач.
Мы также узнали, как создавать отношение родитель-потомок между объектами и сделали первый шаг в редактировании мешей. В подробностях, мы увидели как:
• Создать конфигурируемый меш-объект
• Разработать графический интерфейс пользователя
• Заставить ваш скрипт сохранять выборы пользователя для многократного использования впоследствии
• Выбирать вершины и грани в меше
• Делать родителем объекта другой объект
• Создавать группы
• Модифицировать меш
• Запускать Блендер с командной строки и рендерить в фоновом режиме
• Обрабатывать параметры командной строки
В следующей главе мы увидим, как можно назначать группы вершин и материалы нашим мешам.
3
Группы вершин и материалы
Сложными мешами бывает трудно манипулировать, когда вершин очень много. В этой главе мы рассмотрим, как мы можем облегчить жизнь конечного пользователя, определяя группы вершины, чтобы пометить их наборы. Мы также изучим несколько видов использования групп вершин, включая их использование в арматурах и модификаторах, и мы взглянем на методы применения различных материалов к различным частям меша.
В этой главе мы изучим:
• Определение групп вершин
• Назначение вершин в группу
• Назначение материалов граням
• Назначение вершинных цветов вершинам
• Установка свойств рёбер
• Добавление модификаторов
• Покрытие костей кожей (оснастка меша)
Группы вершин
Группы Вершин (Vertex groups) являются способом организации наборов вершин в пределах меша. Меш может иметь любое количество групп вершин, и любая вершина в пределах меша может быть членом более, чем одной группы вершин, или может не принадлежать никакой группе вершин совсем. Вновь созданный Меш-объект не содержит никаких определённых групп вершин.
В их основной форме, группы вершин являются ценным средством в идентификации определённых частей сложного меша. Назначая вершины в вершинные группы, разработчик модели в конечном счете обеспечивает людей, например, риггеров или текстурщиков, средствами для легкой идентификации и выбора частей модели, с которой они хотят работать.
Все же использование групп вершин идет гораздо дальше простой идентификации. Множество модификаторов мешей ограничивают своё влияние до определенной группы вершин, а арматуру можно сконфигурировать так, чтобы при деформации меша влияние каждой кости было привязано к единственной группе вершин. Мы увидим примеры этого позже.
Группа вершин является не просто набором вершин. С каждой вершиной в вершинной группе можно связать вес (weight, от нуля до единицы), который используется множеством модификаторов для более точной настройки их влияния. Вершина может иметь различные, связанные с ней, веса в каждой вершинной группе, которой принадлежит.
Жуки, которых мы создаем с помощью creepycrawlies.py - отличный пример довольно сложного меша со многими отчётливыми частями, для которых было бы очень полезно определить группы вершин. Не только для того, чтобы упростить выбор части по имени, например головы (head), но также, чтобы облегчить себе жизнь, если мы хотим оснастить (rig) модель. Наши основные инструменты в создании групп вершин - методы Меш-объектов, перечисленные в следующей таблице:
Метод:
addVertGroup(group)
Действие:
Добавляет новую пустую группу вершин.
Метод:
assignVertsToGroup(group, vertices,weight,mode)
Действие:
Добавляет список индексов вершин к существующей группе вершин с данным весом.
Замечание:
Mode (режим) определяет что делать, когда вершина уже является членом группы вершин. Смотри основной текст относительно деталей.
Метод:
getVertsFromGroup(group, weightsFlag=0,vertices)
Действие:
Возвращает список индексов вершин (по умолчанию) или список (индекс, вес) кортежей (если weightsFlag = 1). Если список vertices определён, возвращаются только вершины, присутствующие в этом списке и в группе.
Метод:
removeVertsFromGroup(group, vertices)
Действие:
Удаляет список вершин vertices из существующей группы вершины. Если список не определен, то удаляются все вершины.
Метод:
renameVertGroup(groupName, newName)
Действие:
Переименовывает группу вершин
Метод:
getVertGroupNames()
Действие:
Возвращает список всех имен групп вершин.
Метод:
removeVertGroup(group)
Действие:
Удаляет группу вершин
Замечание:
НЕ удаляет реальные вершины.
Важно понимать, что создание группы вершин и назначение вершин в неё - это два различных действия. Создание новой пустой группы вершин выполняется посредством вызова метода addVertGroup() вашего Меш-объекта. Он принимает единственную строку в качестве аргумента и она будет именем группы вершин. Если уже есть группа вершин с таким именем, к имени будет добавлен цифровой суффикс, чтобы предотвратить совпадение имён, например: TailSegment может стать TailSegment.001.
Добавление вершин в существующую группу вершин производится посредством вызова метода assignVertsToGroup() вашего меша. Этот метод принимает четыре обязательных аргумента - имя группы вершин, которой назначаются вершины, список индексов вершин, вес, и режим назначения. Если группа вершин не существует, или один из индексов вершины указывает на несуществующую вершину, вызывается исключение.
Вес должен быть величиной между 0.0 и 1.0; любой вес больше, чем 1.0 отсекается до 1.0. Вес меньший или равный 0.0 удалит вершину из группы вершин. Если Вы хотите назначить различный вес вершинам в одной и той же группе вершин, Вы должны назначать их в группу с помощью отдельных вызовов метода assignVertsToGroup().
Режим назначения (mode) бывает трёх видов: ADD, REPLACE, и SUBTRACT. ADD добавит новые вершины к группе вершин и свяжет с ними нужный вес. Если какие-нибудь из вершин в списке уже присутствуют, вес к ним будет добавлен. REPLACE заменит вес, связанный с индексами в списке, если они входят в вершинную группу, или ничего не сделает в противном случае. SUBTRACT попытается вычесть вес у вершин в списке и снова ничего не сделает, если они не входят в группу вершин. Чаще всего при добавлении полностью новых групп вершин в меш Вы будете использовать режим ADD.
Весомый вопрос
Для нашего первого примера мы добавим две новых группы вершин к существующему меш-объекту - одна будет содержать все вершины, которые имеют положительную x-координату, а другая будет содержать вершины с отрицательной x-координатой. Мы назовем эти группы Right и Left соответственно.
К тому же, мы дадим каждой вершине в этих группах вес в зависимости от их расстояния от центра объекта, с большим весом для вершин, которые находятся дальше от центра.