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

Выращивание подсолнуха

Выращивание подсолнуха

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

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



Оглавление книги


Генерация: 2.264. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз