Michel Anders - Написание скриптов для Blender 2.49
- Название:Написание скриптов для Blender 2.49
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Michel Anders - Написание скриптов для Blender 2.49 краткое содержание
Расширьте мощность и гибкость Блендера с помощью Питона: высокоуровневого, легкого для изучения скриптового языка
Написание скриптов для Blender 2.49 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Мы хотим, чтобы наши семена не просто двигались вместе с нашей семенной головкой, а следовали за любым локальным изгибом и самостоятельно ориентировались перпендикулярно поверхности головки, так чтобы мы могли, например, искривить главный меш с помощью пропорционального редактирования, и все подключенные к нему семена следовали за ним. Для достижения этого мы используем трёх-вершинный вариант родителя.
При присвоении объекту родителя в виде трех различных вершин меша, этот объект последует за позицией этих вершин и ориентирует себя относительно нормали (смотри следующие иллюстрации):

Нам не нужно соединять все эти триплеты вершин, так как главный меш сам не рендерится (он будет полностью закрыт семенами). Все-же мы определим грань в каждом триплете вершин; в противном случае для разработчика модели будет трудно увидеть главный меш в режиме редактирования.

Лепестки являются отдельными объектами, главный меш будет их родителем как объект, так как они не должны следовать за кривизной меша головки, только за позицией и вращением. Головка, в свою очередь, будет потомком стебля, так что мы можем перемещать всю сборку, перемещая стебель.
Наконец, мы назначаем все индивидуальные объекты в единую группу. Таким образом, можно будет легко выбрать всё за один раз, и это позволит нам ссылаться или добавлять один или больше подсолнухов из внешнего файла как единую сущность.
Мы сказали, что все наши семена и лепестки - отдельные объекты, но имеет больше смысла сделать взамен него экземпляр (в Блендере называется создать связанную копию). Так как все семена и все лепестки, которые мы смоделировали, идентичны, мы можем ссылаться на те же самые меш-данные и просто изменять позицию, вращение, или масштаб объекта как нужно, сохраняя приличное количество памяти. При использовании Блендера интерактивно, мы можем создать экземпляр объекта, нажимая Alt + D (вместо Shift + D для обычной копии). В нашем скрипте, мы просто определяем новый объект и указываем его на тот же меш-объект, передавая ссылку на тот же меш при вызове Object.New() .
Давайте посмотрим на основную часть скрипта, который создаёт подсолнух (полный скрипт доступен как sunflower.py). Первый шаг должен вычислить позицию семян:
def sunflower(scene,nseeds=100,npetals=50):
pos = kernelpositions(nseeds)
Исходя из этих позиций мы создаем головку, у которой вершины и грани мы можем сделать родителем зёрен и собрать их в меш головки (выделенная часть следующего кода):
headverts=pos2verts(pos)
faces=[(v,v+1,v+2) for v in range(0,len(headverts),3)]
head=Tools.addmeshobject(scene,headverts,
faces,name='head')
Следующий шаг должен создать базовый меш для зерна и создать объекты, которые ссылаются на этот меш (выделенная часть следующего кода):
kernelverts,kernelfaces=kernel(radius=1.5,
scale=(1.0,1.0,0.3))
kernelmesh = Tools.newmesh(kernelverts,
kernelfaces,name='kernel')
kernels = [Tools.addmeshduplicate(scene,kernelmesh,
name='kernel')
for i in range(nseeds)]
Каждому зерну затем назначается пригодная позиция и родитель - подходящие вершины в меше головки цветка (выделенная часть следующего кода):
for i in range(nseeds):
loc = Tools.center(head.data.verts[i*3:(i+1)*3])
kernels[i].setLocation(loc)
head. makeParentVertex([kernels[i]],
tuple([v.index for v in
head.data.verts[i*3:(i+1)*3]]))
Затем мы создаем меш лепестка и размещаем дубликаты этого меша вдоль обода головки цветка (выделенная часть следующего кода):
petalverts,petalfaces=petal((2.0,1.0,1.0))
petalmesh =
Tools.newmesh(petalverts,petalfaces,name='petal')
r = sqrt(nseeds)
petals =
[ Tools.addmeshduplicate(scene,petalmesh,name='petal')
for i in range(npetals)]
Каждый лепесток позиционируется, поворачивается вдоль обода и назначается потомком головки (выделенная часть следующего кода):
for i,p in enumerate(petals):
a=float(i)*2*pi/npetals
p.setLocation(r*cos(a),r*sin(a),0)
e=p.getEuler('localspace')
e.z=a
p.setEuler(e)
head. makeParent(petals)
Наконец, мы создаём меш и объект стебля, и назначаем стебель родителем головки. Таким образом, весь цветок может перемещаться при перемещении стебля:
# добавление стебля (stalk) (head назначается потомком
stalk)
stalkverts,stalkfaces=stalk()
stalkob =
Tools.addmeshobject(scene,stalkverts,stalkfaces,
name='stalk')
stalkob.makeParent([head])
Все, что осталось сделать - нужно сгруппировать зерна и лепестки в отдельных группах (выделено), и затем все части подсолнуха в целом группируются, чтобы было легко ссылаться на него:
kernelgroup = Blender.Group.New('kernels')
kernelgroup.objects=kernels
petalgroup = Blender.Group.New('petals')
petalgroup.objects=petals
all = Blender.Group.New('sunflower')
all.objects=sum([kernels,petals],[head,stalkob])
Функция addmeshduplicate() , используемая в коде, объявлена в модуле Tools следующим способом:
def addmeshduplicate(scn,me,name=None):
ob=scn.objects.new(me)
if name : ob.setName(name)
scn.objects.active=ob
me.remDoubles(0.001)
me.recalcNormals()
for f in me.faces: f.smooth = 1
me.update()
Blender.Window.RedrawAll()
return ob
Принимая сцену, меш, и имя (необязательное) для объекта, она добавляет новый объект в сцену. Меш-объект принимается как аргумент, и может использоваться снова и снова для создания новых объектов, которые ссылаются на этот же меш.
Вновь созданные объекты становятся автоматически выбранными, но не делаются активными, так что следующий шаг должен сделать вновь-созданный объект активным (выделено в предыдущем коде). Не необходимы, но, возможно, удобны пользователю следующие два действия: обеспечение того, чтобы все нормали граней были единообразно направлены наружу, и удаление всех вершин, которые слились слишком близко вместе. Эти последние два действия можно выполнить только в меше, который вставлен в объект.
Также, для удобства, мы установили атрибут smooth (плавно) для всех граней, чтобы получить более гладкие изображения при рендере. Наконец, мы обновляем (update) список отображения для этого меша и уведомляем всё окно Блендера, что имеется изменение.
Небольшое отступление, или почему кролики связаны с подсолнухами.
Одна из вещей, которую Вы можете заметить - то, что мы разместили семена в специфической спирали. Этот тип спирали, где последующие позиции вдоль спирали расположены идующими с так называемым Золотым сечением, называется спираль Ферма(Fermat's spiral). Такой спиралью получается естественным образом во многих семенных головках, когда цветочки или семена формируются в середине и выталкиваются наружу, в результате получается очень рациональная (плотная) упаковка.
Читать дальшеИнтервал:
Закладка: