Написание скриптов для Blender 2.49 - страница 34

стр.

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

Вес должен быть величиной между 0.0 и 1.0; любой вес больше, чем 1.0 отсекается до 1.0. Вес меньший или равный 0.0 удалит вершину из группы вершин. Если Вы хотите назначить различный вес вершинам в одной и той же группе вершин, Вы должны назначать их в группу с помощью отдельных вызовов метода assignVertsToGroup().

Режим назначения (mode) бывает трёх видов: ADD, REPLACE, и SUBTRACT. ADD добавит новые вершины к группе вершин и свяжет с ними нужный вес. Если какие-нибудь из вершин в списке уже присутствуют, вес к ним будет добавлен. REPLACE заменит вес, связанный с индексами в списке, если они входят в вершинную группу, или ничего не сделает в противном случае. SUBTRACT попытается вычесть вес у вершин в списке и снова ничего не сделает, если они не входят в группу вершин. Чаще всего при добавлении полностью новых групп вершин в меш Вы будете использовать режим ADD.


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

Для нашего первого примера мы добавим две новых группы вершин к существующему меш-объекту - одна будет содержать все вершины, которые имеют положительную 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)).