Написание скриптов для Blender 2.49 - страница 31
При присвоении объекту родителя в виде трех различных вершин меша, этот объект последует за позицией этих вершин и ориентирует себя относительно нормали (смотри следующие иллюстрации):
Нам не нужно соединять все эти триплеты вершин, так как главный меш сам не рендерится (он будет полностью закрыт семенами). Все-же мы определим грань в каждом триплете вершин; в противном случае для разработчика модели будет трудно увидеть главный меш в режиме редактирования.
Лепестки являются отдельными объектами, главный меш будет их родителем как объект, так как они не должны следовать за кривизной меша головки, только за позицией и вращением. Головка, в свою очередь, будет потомком стебля, так что мы можем перемещать всю сборку, перемещая стебель.
Наконец, мы назначаем все индивидуальные объекты в единую группу. Таким образом, можно будет легко выбрать всё за один раз, и это позволит нам ссылаться или добавлять один или больше подсолнухов из внешнего файла как единую сущность.
Мы сказали, что все наши семена и лепестки - отдельные объекты, но имеет больше смысла сделать взамен него экземпляр (в Блендере называется создать связанную копию). Так как все семена и все лепестки, которые мы смоделировали, идентичны, мы можем ссылаться на те же самые меш-данные и просто изменять позицию, вращение, или масштаб объекта как нужно, сохраняя приличное количество памяти. При использовании Блендера интерактивно, мы можем создать экземпляр объекта, нажимая 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()