Другая вещь, которую нужно отметить в этой функции — использование операций с множествами. Они немного ускорят процесс, так как операции с множествами в Питоне чрезвычайно быстрые. Мы используем их здесь, чтобы проверять множество вершин (или, скорее, их индексов), которые составляют грань, на то, что все они входят в множество индексов вершин, находящихся в некоторой группе вершин. Мы заранее вычисляем оба множества индексов вершин, те, которые принадлежат группе вершин и индексы вершин каждой грани, и храним их в словарях для легкого доступа. Таким образом, мы создаем эти множества только однажды, для каждой группы вершин и для каждой грани соответственно, вместо воссоздания каждого множества всякий раз, когда мы сопоставляем регулярное выражение. Для больших мешей это потенциально сохранит много времени (за счет памяти).
import re
def matindex2vertgroups(me,matgroups):
if len(matgroups)>16 :
raise ArgumentError("number of groups larger than
number of materials possible (16)")
groupnames = me.getVertGroupNames()
vertexgroupset={}
for name in groupnames:
vertexgroupset[name]=set(me.getVertsFromGroup(name))
print name,len(vertexgroupset[name])
faceset={}
for f in me.faces:
faceset[f.index]=set([v.index for v in f.verts])
for i,matgroup in enumerate(matgroups):
for name in groupnames:
if re.search('^'+matgroup+'$',name):
for f,vset in faceset.items():
if vset.issubset(vertexgroupset[name]) :
me.faces[f].mat = i
break
Итог
В этой главе, мы видели как сделать жизнь легче для наших конечных пользователей, определяя вершинные группы у мешей, чтобы упростить выбор определенных характеристик. Мы также видели, как назначать материалы вершинам, и как создавать новые материалы, если нужно. Первые шаги были предприняты, чтобы оснастить (rig) меш. В частности, мы узнали:
• Как определять вершинные группы
• Как назначать вершины в вершинные группы
• Как назначать материалы граням
• Как назначать вершинам вершинные цвета
• Как устанавливать свойства рёбер
• Как добавлять модификатор
• Как покрывать кожей кости
Далее мы выйдем за пределы статики, и увидим как управлять перемещением объектов.
4
PyDrivers и Constraints (Управляющие объекты и Ограничения)333
Перевод: S.Lavik, Striver
Проектируя сложные объекты с подвижными частями, мы хотели бы управлять перемещением этих частей относительно друг друга. Иногда, для достижения цели мы можем использовать физические движки, например, такие как Bullet physics, но часто этого не достаточно для точного воспроизведения анимации, физический движок не всегда предоставляет необходимый контроль над сценой. Большую часть времени умное использование многократных ограничений будет вполне достаточным, но иногда взаимосвязи между объектами (другими словами хорошая анимация) не могут быть выражены с точки зрения простых ограничений и ключевой анимации. В таких случаях мы можем расширить возможности Блендера, определив собственные ограничения или отношения между анимируемыми объектами, используя Питон.
В этой главе мы увидим, как можно связать встроенные ограничения с объектами Блендера и как определить сложные отношения между анимированными объектами используя так называемые pydrivers. Мы также определим новые сложные ограничения, которые могут использоваться точно так же, как и встроенные ограничения. Мы пока не будем изучать такие определения, как ключевые кадры (key frames), поскольку мы столкнемся с ними в более поздних главах.
В этой главе мы узнаем:
• Как управлять одним IPO из другого в выражениях Питона
• Как работать с некоторыми ограничениями, присущими pydrivers
• Как управлять движением объектов и костей, добавляя ограничения
• Как написать ограничение в Питоне, которое привяжет один объект к ближайшей к нему вершине на другом объекте
Для начала давайте познакомимся с некоторыми определениями, чтобы получить ясное представление о том, с чем мы имеем дело.
Акцентируем внимание на свойствах анимации
Блендер универсален, но достаточно сложен. Прежде, чем мы сможем манипулировать анимацией объектов с помощью Питона, необходимо, чтобы мы разобрались с основными понятиями.