- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
При работе со скриптом важно иметь в виду, что когда отпечаток вычисляется, ни одна из вершин меша, который получает отпечаток, не должна быть расположена внутри цели раньше, чем она сдвинется. Если это случилось, то, возможно, вершина будет сметена вслед за перемещением цели, исказив исходный меш вдоль пути. Например, чтобы сделать иллюстрацию колесного следа в грязи, мы анимируем катящееся колесо вдоль пути, рассчитывая отпечатки, которые оно делает в каждом кадре. В первом кадре, который мы анимируем, мы должны убедиться, что колесо не касается плоскости земли, иначе она может быть искажена, поскольку, если вершина плоскости земли оказалась внутри колеса и близко ко внутреннему ободу, она будет перемещена на ближайшую вершину на этом ободе. Если колесо катится медленно, эта вершина останется близко к этому внутреннему ободу, и тем самым фактически будет клеиться к этому движущемуся внутреннему ободу, разрывая в процессе плоскость земли. Тот же разрушительный процесс может произойти, если целевой объект очень маленький по сравнению с исходным мешем или перемещается очень быстро. В этих обстоятельствах, вершина может проникнуть в целевой объект так быстро, что ближайшая вершина не будет находиться на ведущей поверхности, создающей отпечаток, но окажется где-нибудь в другом месте цели, и в результате вершины будут притянуты ко внешней стороне вместо проталкивания внутрь. В иллюстрации катящейся шины трактора, мы тщательно спозиционировали шину в первом кадре, чтобы она находилась строго справа от подразделенной плоскости перед ключевым кадром, начинающим катящееся движение влево. Показанное изображение взято из кадра 171 без какого-либо сглаживания или применённых материалов к плоскости.
Итог
В этой главе мы узнали как привязывать изменения к развитию кадров анимации и как обращаться к информации о состоянии объекта. Мы также видели как сменять слои, например, чтобы объект на рендере стал невидимым. В подробностях, мы увидели:
• Что такое скриптсвязи и обработчики пространства
• Как выполнять действия при каждом изменении кадров в анимации
• Как ассоциировать дополнительную информацию с объектом
• Как заставить объект появляться или исчезать изменением слоя или изменением прозрачности
• Как осуществить схему, соединяющую разные меши с объектом в каждом кадре
• Как расширить функциональность 3D-вида Далее: добавление ключей формы и кривых IPO.
6
Ключи формы, кривые IPO, и Позы
Мы уже сталкивались с кривыми IPO в Главе 4, Pydrivers and Constraints, когда мы обсуждали Pydrivers, но с IPO можно делать гораздо больше, чем просто управлять одним IPO посредством другого. Например, API Блендера обеспечивает нас средствами для создания IPO из ничего, что позволяет определить движение, которое не легко воссоздать, устанавливая ключевые кадры вручную. Кроме того, некоторые типы кривых IPO имеют отчасти отличающееся поведение по сравнению с теми, с которыми мы до сих пор сталкивались. Ключи Формы и Позы - примеры (наборов) кривых IPO, которые отличаются от, например, IPO позиции. Мы столкнемся как с ключами формы, так и Позами позже в этой главе, но мы начнём с рассмотрения того, как мы можем определять IPO из ничего.
В этой главе мы изучим, как:
• определять кривые IPO
• определять ключи формы у меша
• определять IPO для этих ключей формы
• позировать арматуры
• группировать изменения поз в действия
Обидчивый субъект - определение IPO из ничего
Множество путей движения объектов трудно моделировать вручную, например, когда мы хотим, чтобы объект следовал в точности по математической кривой, или если мы хотим скоординировать перемещение многочисленных объектов по некоторому пути, что не легко выполнить копированием кривых IPO или определением Управляющих объектов IPO (drivers).
Представьте себе следующий сценарий: мы хотим произвести взаимообмен позиций некоторых объектов в течении определённого времени плавным путём без того, чтобы объекты проходили сквозь друг друга в середине, и даже не касались друг друга. Наверное, это можно выполнить настройкой ключей вручную, но в тоже время довольно обременительно, особенно если нам может понадобиться повторить это для нескольких наборов объектов. Скрипт, который мы разработаем, заботится о всех этих деталях и может быть применим к любым двум объектам.
Схема программы: orbit.pyСкрипт orbit.py, который мы разработаем, будет предпринимать следующие шаги:
1. Определение точки середины пути между выбранными объектами.
2. Определение протяженности выбранных объектов.
3. Определение IPO для объекта один.
4. Определение IPO для объекта два.
Определение точки середины пути между выбранными объектами будет достаточно легко: мы просто возьмем среднее позиций обоих объектов. Определение протяженности выбранных объектов будет всё-таки некоторым вызовом. Объект может иметь неправильную форму, и определение кратчайшего расстояния с учётом любого возможного поворота объектов на пути трудно для вычисления. К счастью, мы можем сделать разумное приближение, так как каждый объект имеет связанный с ним габаритный ящик (bounding box).
Этот габаритный ящик является прямоугольным параллелепипедом, который просто включает в себя все точки объекта. Если взять половину диагонали в качестве протяженности (размера) объекта, то легко видеть, что это расстояние может быть гораздо больше того, насколько близко мы можем быть к другому объекту, не касаясь его, в зависимости от точной формы объекта. Но это гарантирует, что мы никогда не окажемся слишком близко. Этот габаритный ящик легко получить из объектного метода getBoundBox() в виде списка из восьми векторов, каждый из которых представляет один из углов габаритного ящика. Понятие проиллюстрировано на следующем рисунке, где показаны габаритные ящики двух сфер:
Длина диагонали габаритного ящика может быть вычислена определением как максимального так и минимального значений для каждой из координат x, y, и z. Компоненты вектора, представляющего эту диагональ, являются разницами между этими максимумом и минимумом. Длина диагонали впоследствии получается взятием квадратного корня суммы квадратов компонент x, y, и z. Функция diagonal() довольно кратко реализована, так как она использует много встроенных функций Питона. Она принимает список векторов в виде аргумента, а затем проходит циклом по каждой из компонент (выделено. Компоненты x, y, и z объекта Vector в Блендере могут быть доступны по индексам 0, 1, и 2 соответственно):
def diagonal(bb):
maxco=[]
minco=[]
for i in range(3):
maxco.append(max(b[i] for b in bb))
minco.append(min(b[i] for b in bb))
return sqrt(sum((a-b)**2 for a,b in zip(maxco,minco)))
Она определяет пределы для каждой компоненты, используя встроенные функции max() и min(). В конце она возвращает длину, спаривая каждый минимум и максимум с помощью функции zip().
Следующим шагом нужно проверить, что мы имеем в точности два выбранных объекта, и если это не так, сообщить пользователю, отображая всплывающее меню (выделено в следующем куске кода). Если у нас есть два выбранных объекта, мы извлекаем их позиции и габаритные ящики. Затем мы вычисляем максимальное расстояние w, на которое каждый объект должен отклониться от своего пути, оно должно быть половиной минимального расстояния между ними, что эквивалентно четверти суммы длин диагоналей этих объектов:
obs=Blender.Scene.GetCurrent().objects.selected
if len(obs)!=2:
Draw.PupMenu('Please select 2 objects%t|Ok')
else:
loc0 = obs[0].getLocation()
loc1 = obs[1].getLocation()
bb0 = obs[0].getBoundBox()
bb1 = obs[1].getBoundBox()
w = (diagonal(bb0)+diagonal(bb1))/4.0
Прежде, чем мы сможем вычислить траектории обоих объектов, мы сначала создадим два новых и пустых объекта кривых IPO:
ipo0 = Ipo.New('Object','ObjectIpo0')
ipo1 = Ipo.New('Object','ObjectIpo1')
Мы произвольно выбираем начальный и конечный кадры нашей операции обмена в 1 и 30 соответственно, но скрипт легко может быть адаптирован для того, чтобы пользователь вводил эти величины. Мы итерируем по каждой отдельной кривой IPO для IPO местоположения и создаем первую точку (или ключевой кадр) и этим самым фактически назначается кортеж (номер кадра, значение) на кривую (выделенные строки следующего кода). Последующие точки могут быть добавлены к этим кривым по индексу - их номеру кадра присвоением значения, как это сделано для кадра 30 в следующем коде:

