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

Весомый вопрос

Весомый вопрос

Для нашего первого примера мы добавим две новых группы вершин к существующему меш-объекту - одна будет содержать все вершины, которые имеют положительную x-координату, а другая будет содержать вершины с отрицательной x-координатой. Мы назовем эти группы Right и Left соответственно.

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

Схема кода: leftright.py

Схематически мы предпримем следующие шаги:

1. Получить активный объект.

2. Проверить, что это - меш и получить меш-данные.

3. Добавить две новых группы вершин к объекту -  Left и Right.

4. Для всех вершин в меше:

1. Посчитать вес

2. Если x-координата > 0:

3. Добавить индекс вершины и вес в группу вершин right

4. Если x-координата < 0:

5. Добавить индекс вершины и вес в группу вершин left

Для того, чтобы убедиться, что новая группа вершин пуста, мы проверяем, существует ли уже эта группа, и в этом случае удаляем из неё вершины. Эта проверка выделена в коде:

def leftright(me,maximum=1.0):
   center=vec(0,0,0)
   left =[]
   right=[]
   for v in me.verts:
      weight = (v.co-center).length/maximum
      if v.co.x > 0.0 :
         right.append((v.index, weight))
      elif v.co.x > 0.0 :
         left.append((v.index, weight))
   return left,right  
if __name__ == "__main__":
   try:
      ob = Blender.Scene.GetCurrent().objects.active
      me = ob.getData(mesh=True)
      vgroups = me.getVertGroupNames()
      if 'Left' in vgroups:
         me.removeVertsFromGroup('Left')
      else:
         me.addVertGroup('Left')
      if 'Right' in vgroups:
         me.removeVertsFromGroup('Right')
      else:
         me.addVertGroup('Right')
      left,right = leftright(me,vec(ob.getSize()).length)
      for v,w in left:
         me.assignVertsToGroup('Left',[v],
                          w,Blender.Mesh.AssignModes.ADD)
      for v,w in right:
         me.assignVertsToGroup('Right',[v],w,
                          Blender.Mesh.AssignModes.ADD)
      Blender.Window.Redraw()
   except Exception as e:
      Blender.Draw.PupMenu('Error%t|'+str(e)[:80])

Полный скрипт доступен в файле leftright.py. Формуле, вычисляющей вес, возможно, нужно некоторое объяснение: для того, чтобы назначить максимальный вес 1.0 в точке, лежащей на наибольшем расстоянии от центра объекта, мы должны масштабировать максимально возможным расстоянием. Мы могли бы пройтись циклом по всем вершинам, чтобы сначала определить максимум, но здесь мы решаем аппроксимировать этот максимум корнем от суммы квадратов размеров. Это заведомо больше максимального расстояния, так что максимальный вес, назначаемый любой из вершин, вероятно, будет меньше чем 1.0. Тем не менее, получение размера - значительно быстрее, чем расчет точного максимума для больших мешей. Также заметьте, что мы вычисляем расстояние до центра (центр объекта в режиме просмотра вершин в меше - всегда в (0, 0, 0)).

Он может отличаться от того, что пользователь может воспринимать как центр меша. (Центр объекта отображается как розовая точка в Блендере и может быть изменён, чтобы лежать в средней позиции всех вершин, с помощью  Object | Transform | Center new.)

Результирующий вес для меша может выглядеть похожим на это:


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

Оглавление статьи/книги

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