Чтение онлайн

ЖАНРЫ

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

Anders Michel

Шрифт:

Удаляет список вершин 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 соответственно.

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

Схема кода: 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)).

Поделиться с друзьями: