Книга: Написание скриптов для Blender 2.49

Добавление материалов в нашу гравюру

Добавление материалов в нашу гравюру

Как последний штрих в нашей деятельности с гравюрой, мы добавим два материала. Один индекс материала назначим вершинам на поверхности, и другой вершинам в выточенных канавках. Этим методом мы можем, например, создать проявление вновь созданной надписи на куске выветренного камня.

Так как мы ранее определили несколько удобных групп вершин, назначение индексов материала будет вопросом итерации над всеми гранями и назначения в каждую вершину грани подходящего индекса материала в зависимости от того, членом какой вершинной группы является вершина. Функция, показанная ниже, принимает чуть более общий подход, так как она принимает меш и список регулярных выражений, и назначает индекс материала на каждую грань в зависимости от принадлежности к группе вершин, которая имеет имя, соответствующее одному из регулярных выражений.

Эти функции делают очень легким назначение одинакового индекса материала во все группы вершин, которые имеют аналогичные имена, например все хвосты и сегменты грудной клетки меша, создаваемого creepycrawlies.py (они все имеют такие имена как, например, tail.0, tail.1, , и так далее).

Функция доступна в Tools.py. Она зависит от функции Питона re.search(), которая  сопоставляет регулярное выражение со строкой. Выделенная строка показывает, что мы вставляем строку регулярного выражения в так называемые якоря (^ и $). Этим путём регулярное выражение, такое как например, aaaa, сопоставится только с группой вершин с именем aaaa, а не с именем aaaa.0, так что мы сможем различить их, если мы хотим. Если же мы хотим соответствия всем именам групп вершин, которые начинаются с tail, мы могли бы, например, передать регулярное выражение tail.* .


Регулярные выражения являются чрезвычайно мощным способом сопоставления строк. Если Вы незнакомы с ними, Вы должны обратиться к документации   по   модулю   Питона  re (http://docs.python.org/library/re.html).  Можно начать, например, с http://wiki.intuit.ru.

Другая вещь, которую нужно отметить в этой функции — использование операций с множествами. Они немного ускорят процесс, так как операции с множествами в Питоне чрезвычайно быстрые. Мы используем их здесь, чтобы проверять множество вершин (или, скорее, их индексов), которые составляют грань, на то, что все они входят в множество индексов вершин, находящихся в некоторой группе вершин. Мы заранее вычисляем оба множества индексов вершин, те, которые принадлежат группе вершин и индексы вершин каждой грани, и храним их в словарях для легкого доступа. Таким образом, мы создаем эти множества только однажды, для каждой группы вершин и для каждой грани соответственно, вместо воссоздания каждого множества всякий раз, когда мы сопоставляем регулярное выражение. Для больших мешей это потенциально сохранит много времени (за счет памяти).

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


Оглавление книги


Генерация: 1.198. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз