Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
scn = Blender.Scene.GetCurrent()
arm = scn.objects.active
if arm.getType()!='Armature':
Blender.Draw.PupMenu("Selected object is not an " +
"Armature%t|Ok")
else:
adata = arm.getData()
Затем, мы делаем арматуру редактируемой и убеждаемся, что у каждой кости задана опция HINGE (выделено). Преобразование списка опций в множество (set) и обратно в список после добавления опций HINGE является способом удостовериться, что эта опция появится в списке только один раз.
adata.makeEditable()
for ebone in adata.bones.values():
ebone.options =
list(set(ebone.options)|
set([Blender.Armature.HINGE]))
adata.update()
Поза связана с объектом арматуры, а не со своими данными, так что мы получаем её из объекта arm, используя метод getPose(). Позы кости очень похожи на обычные IPO, но они должны быть связаны с действием (action), которое группирует эти позы. При работе с Блендером интерактивно действие создаётся автоматически, как только мы вставим ключевой кадр в позу, но в скрипте мы должны явно создать действие, если оно ещё не присутствует (выделено):
pose = arm.getPose()
action = arm.getAction()
if not action:
action = Blender.Armature.NLA.NewAction()
action.setActive(arm)
Следующим шагом нужно отсортировать кости Позы в порядке цепи от родительских к дочерним, используя нашу ранее определенную функцию. Всё, что осталось сделать, это двигаться по временной шкале через десять кадров за 1 шаг и задавать ключи для масштаба каждой кости на каждом шаге, увеличивая масштаб, если номер кости в последовательности соответствует нашему шагу и восстанавливая его, если нет. Одна из результирующих кривых IPO показана на скриншоте. Заметьте, что нашей предварительной установкой атрибута HINGE в каждой кости, мы предотвратили распространение масштабирования на детей кости:
bones = sort_by_parent(pose.bones.values())
for frame in range(1,161,10):
index = int(frame/21)-1
n = len(bones)
for i,bone in enumerate(bones):
if i == index :
size = 1.3
else :
size = 1.0
pose.bones[bone].size=Vector(size,size,size)
pose.bones[bone].insertKey(arm,frame,
Blender.Object.Pose.SIZE)
Полный код доступен как peristaltic.py в файле peristaltic.blend.
Применение peristaltic.py к арматуреЧтобы использовать этот скрипт, Вы должны запустить его с выбранным объектом арматуры. Рецепт, чтобы продемонстрировать его применение, будет заключаться в следующем:
1. Добавьте арматуру к сцене
2. Перейдите в режим редактирования, и выдавите любое число костей из конца первой кости.
3. Перейдите в объектный режим и добавьте меш, отцентрированный в позиции арматуры. Любой меш будет работать, но в нашей иллюстрации, мы используем цилиндр со множеством подразбиений.
4. Выберите меш, затем с Shift'ом выберите арматуру. Теперь как арматура, так и Меш-объект выбраны, но в то же время арматура является активным объектом.
5. Нажмите Ctrl + P и выберите armature. В появившемся после этого меню, выберите Create from bone heat. Это создаст группу вершин в меше для каждой кости в арматуре. Эти группы вершин будут использованы для деформации меша, когда мы ассоциируем арматуру с мешем в качестве модификатора.
6. Выберите меш и добавьте модификатор armature. Наберите имя арматуры в поле Ob: и убедитесь, что выбран переключатель Vert. Group, а Envelopes - нет.
7. Выберите арматуру и запустите peristaltic.py. В результате будет анимированный Меш-объект, имеющий сходство с прохождением куска через узкую гибкую трубу. Несколько кадров показаны на иллюстрации:
Водосточные трубы являются, конечно, не единственным полым по форме объектом для анимации этим путём, как показано на следующей иллюстрации:
Get down с ритмом - синхронизация ключей формы со звуком
(Словосочетание Get Down имеет такое количество самых разнообразных значений, что я не рискнул выбирать из них и оставляю без перевода — прим. пер.)
Многочисленные рок-видео сегодня часто показывают анимацию диффузора динамика, вибрирующего в такт со звуком музыки. И хотя возможности для манипуляций со звуком в API Блендера довольно малы, но мы увидим, что этого эффекта несложно достигнуть.
Анимация, которую мы создадим, зависит главным образом от манипуляции ключами формы (shape keys). Ключи Формы можно представлять как искажения базового меша. Меш может иметь много таких искажений и каждому из них даётся определённое имя. Интересно то, что Блендер предоставляет нам возможность интерполяции между базовой формой и любой из искаженных форм непрерывным способом, позволено даже смешивать вклады от разных форм.
Вот, например, один из способов анимировать наш диффузор динамика, нужно смоделировать основную, неискаженную форму диффузора; добавить ключ формы к этому базовому мешу; и исказить его, чтобы появилось сходство с диффузором, который вытолкнут наружу. После этого мы сможем смешивать между собой эти "вытолкнутую" и базовую формы в зависимости от громкости звука.
Анимирование установкой ключевых кадров в Блендере означает создание кривых IPO и манипуляция ими, как мы уже видели раньше. На самом деле, кривые IPO Shape или Key очень похожи на другие типы IPO и управляются практически так же. Основное различие между, например, IPO Объекта и IPO Формы - в том, что индивидуальные кривые IPO Формы проиндексированы не некоторой встроенной числовой константой (как например, Ipo.OB_LOCX для Объектов), а строкой, поскольку пользователь может определить любое количество именованных форм.
Также, IPO Формы доступны не через Объект, а через лежащий в его основе Меш-объект (или Решетку, или Кривую, так как они тоже могут иметь ключи формы).
Манипуляция звуковыми файламиТак что теперь, когда мы знаем, как анимировать формы, нашей следующей целью будет выяснить, как добавить какой-либо звук к нашему мешу, или, вернее, определить для каждого кадра, насколько искаженную форму должно быть видно.
Как упомянуто в предыдущем разделе, API Блендера не обеспечивает большого количества инструментов для работы со звуковыми файлами, в основном модуль Sound обеспечивает нас способом загрузки и воспроизведения звуковых файлов, но на этом и всё. Нет способа получить доступ к индивидуальным точкам волны, закодированным в файле.
К счастью, в стандартный дистрибутив Питона включен модуль wave, который обеспечивает нас средствами для чтения файлов в обыкновенном формате .wav. Хотя он поддерживает только несжатый формат, этого будет достаточно, так как этот формат является очень распространённым, и большинство инструментов работы со звуком, как например, Audacity, могут преобразовывать в этот формат. С этим модулем мы можем открыть .wav-файл, определить частоту сэмплов и длительность звукового клипа, и получить индивидуальные сэмплы. Как мы увидим в объяснении следующего кода, мы все еще должны преобразовывать эти сэмплы в величины, которые мы можем использовать как значения ключей для наших ключей формы, но тяжелую работу уже сделали для нас.
Схема кода: Sound.py
Вооружившись знаниями о том, как создавать кривые IPO и получать доступ к .wav-файлам, мы можем наметить следующую схему программы:
1. Определить, имеет ли активный объект пригодные заданные формы, и предложить выбрать их них.
2. Позволить пользователю выбрать .wav-файл.
3. Определить количество звуковых сэмплов в секунду в файле (частота дискретизации).
4. Вычислить количество необходимых кадров анимации, основываясь на длительности звукового файла и показателе количества видеокадров в секунду.
5. Затем, для каждого кадра анимации:
◦ Усреднить звуковые сэмплы, проходящие в этом кадре
◦ Установить величину смешивания выбранной кривой IPO этому среднему (нормализованному) числу
Полный код доступен как Sound.py в файле sound000.blend и объясняется следующим образом:
import Blender
from Blender import Scene,Window,Draw
from Blender.Scene import Render
import struct
import wave
Мы начинаем, импортируя необходимые модули, включая модуль Питона wave, чтобы иметь доступ к нашему .wav-файлу и модуль struct, который предоставляет функции для манипулирования двоичными данными, которые мы получим из .wav-файла.