Выбрать главу

Затем мы создаем меш лепестка и размещаем дубликаты этого меша вдоль обода головки цветка (выделенная часть следующего кода):

   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). Такой спиралью получается естественным образом во многих семенных головках, когда цветочки или семена формируются в середине и выталкиваются наружу, в результате получается очень рациональная (плотная) упаковка.

Когда мы увидели, размещение семян также кажется, следует за обоими левым и правым поворотами кривых. Количество этих кривых обычно является парой из последовательности Фибоначчи [ 1 1 2 3 5 8 13 21 ] и отношение такой пары чисел стремится сойтись в Золотом сечении, когда они становятся больше. (В двух иллюстрациях нашей семенной головы внизу мы можем различить 13 спиралей против часовой стрелки и 21 спираль по часовой стрелке.) Фибоначчи изобрёл эту серию в попытке моделирования роста населения кроликов. Больше о подсолнухах (и, возможно, кроликах), можно   обнаружить   здесь: http://en.wikipedia.org/wiki/Sunflower.

 Итог

В этой главе мы увидели, как создавать сложные объекты, и как сделать задачу конфигурирования этих объектов легкой для конечного пользователя, предоставив графический интерфейс, который помнит предыдущие настройки. Мы также увидели, что можно привлечь Блендер, как инструмент командной строки, для автоматизации часто выполняемых задач.