Затем для каждого кадра мы вычисляем от стартового кадра до последнего кадра (исключительно) среднее значение аудио сэмплов, которые попадают на каждый видеокадр суммированием этих аудио сэмплов (находятся в списке
Мы задаём выбранный ключ формы в величину в дипазоне [0:1], так что мы должны нормализовать рассчитанные средние числа, определяя минимальную и максимальную величины, и вычислить масштаб:
staframe = context.startFrame()
endframe = int(staframe +
seconds*context.framesPerSec())
popout=[]
for i in range(staframe,endframe):
popout.append(sum(samples[int(
(i-1)*sampleratio):int(i*sampleratio)])/sampleratio)
minvalue = min(popout)
maxvalue = max(popout)
scale = 1.0/(maxvalue-minvalue)
Наконец, мы получаем активный объект в текущей сцене и получаем его IPO Формы (выделено). Мы заканчиваем, устанавливая величину ключа формы для каждого кадра в рассматриваемом нами диапазоне в масштабированное среднее аудио сэмплов:
ob=Blender.Scene.GetCurrent().objects.active
ipo = ob.getData().getKey().getIpo()
for i,frame in enumerate(range(staframe,endframe)):
ipo[shapekey][frame]=(popout[i]-minvalue)*scale
Остальной скрипт теперь довольно прост. Он выбирает активный объект, затем пытается извлечь список имен ключей формы из него (выделено в следующей части). Это действие может потерпеть неудачу (следовательно, применяется
if __name__ == "__main__":
ob=Blender.Scene.GetCurrent().objects.active
try:
shapekeys = ob.getData().getKey(
).getIpo().curveConsts
key = popup(('Select a shape key%t|'+
'|').join(shapekeys))
if key>0:
Window.FileSelector (lambda f:sound2active(f,
shapekeys[key-1]),
"Select a .wav file",
Blender.Get('soundsdir'))
except:
popup('Not a mesh or no shapekeys defined%t|Ok')
Если мы смогли извлечь список ключей формы, мы предоставляем пользователю всплывающее меню для выбора из этого списка. Если пользователь выбирает один из пунктов, переменная
Начальный каталог, который будет представлен пользователю в выборе файлов, определяется последним аргументом в функции
Теперь, когда у нас есть наш скрипт Sounds.py, мы можем применить его следующим образом:
1. Выбрать Меш-объект
2. Добавить ключ формы "
3. Добавить второй ключ формы и дать ему значимое имя.
4. Отредактировать этот меш, чтобы он представлял наиболее искаженную форму.
5. В режиме объектов, запустить
6. Выбрать имя ключа формы, определенное раньше (не "Basis"), из выпадающего меню.
7. Выбрать .wav-файл для выполнения.
Результатом будет объект с кривой IPO для выбранного ключа формы, который будет колебаться согласно ритму звука, как показано на следующем скриншоте:
Итог
В этой главе мы увидели как соединять ключи формы с мешем и как добавлять кривые IPO, чтобы анимировать переходы между этими ключами формы. Подробнее, мы узнали как:
• определять кривые IPO
• определять ключи формы на меше
• определять кривые IPO для этих ключей формы
• позировать арматуры