ipo = ob.getData().getKey().getIpo()
for i,frame in enumerate(range(staframe,endframe)):
ipo[shapekey][frame]=(popout[i]-minvalue)*scale
Остальной скрипт теперь довольно прост. Он выбирает активный объект, затем пытается извлечь список имен ключей формы из него (выделено в следующей части). Это действие может потерпеть неудачу (следовательно, применяется try … except), если, например, активный объект - не меш или он не имеет связанных ключей формы, в этом случае мы предупреждаем пользователя с помощью всплывающего сообщения:
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')
Если мы смогли извлечь список ключей формы, мы предоставляем пользователю всплывающее меню для выбора из этого списка. Если пользователь выбирает один из пунктов, переменная key будет положительной и мы предоставляем пользователю диалог выбора файлов (выделено). В этот диалог передаётся lambda-функция, которая будет вызвана, если пользователь выберет файл, с передачей имени этого выбранного файла в качестве аргумента. В нашем случае мы создаём эту lambda-функцию, чтобы вызвать функцию sound2active(), определённую ранее с этим именем файла и выбранным ключом формы.
Начальный каталог, который будет представлен пользователю в выборе файлов, определяется последним аргументом в функции FileSelector(). Мы задали его параметром Блендера soundsdir. Это обычно // (то есть, относительный путь, указывающий на тот же каталог, где находится .blend-файл, с которым пользователь работает), но может быть установлен в окне Пользовательских настроек (секция File Paths) на нечто другое.
Теперь, когда у нас есть наш скрипт Sounds.py, мы можем применить его следующим образом:
1. Выбрать Меш-объект
2. Добавить ключ формы "Basis" к нему (окно Кнопок, контекст редактирования, панель Shapes). Он будет соответствовать наименее искаженной форме меша.
3. Добавить второй ключ формы и дать ему значимое имя.
4. Отредактировать этот меш, чтобы он представлял наиболее искаженную форму.
5. В режиме объектов, запустить Sound.py из текстового редактора, нажимая Alt + P.
6. Выбрать имя ключа формы, определенное раньше (не "Basis"), из выпадающего меню.
7. Выбрать .wav-файл для выполнения.
Результатом будет объект с кривой IPO для выбранного ключа формы, который будет колебаться согласно ритму звука, как показано на следующем скриншоте:
Итог
В этой главе мы увидели как соединять ключи формы с мешем и как добавлять кривые IPO, чтобы анимировать переходы между этими ключами формы. Подробнее, мы узнали как:
• определять кривые IPO
• определять ключи формы на меше
• определять кривые IPO для этих ключей формы
• позировать арматуры
• группировать изменения поз в действия
В следующей главе мы должны узнать, как создавать заказные текстуры и шейдеры.
7
Создание заказных шейдеров и текстур с помощью Pynodes
Иногда говорят, что, хотя Блендер имеет мощную и разностороннюю систему для определения материалов, ему недостает соответствующего шейдерного языка, чтобы определять полностью новые шейдеры, например, для создания материалов, которые реагируют на свет новыми способами. Тем не менее, это не совсем так.
Блендер не имеет компилируемого шейдерного языка, но он имеет мощную нодовую (узловую) систему для комбинирования текстур и материалов, и эти ноды могут быть скриптами на Питоне (Pynodes). Это позволяет определять полностью новые текстуры и материалы.
В этой главе мы изучим:
• Как писать Pynodes, которые создают простые цветные узоры
• Как писать Pynodes, которые производят узоры с нормалями
• Как писать анимированные Pynodes
• Как писать материалы, зависимые от высоты и наклона