- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
def topi(a,h,i):
m = a%(2*pi)
r=0.0
if m<h: r=i
return r
pydriver-выражение для канала энергии (называемый "Energ" в редакторе Кривых IPO), может быть выражено следующим образом:
p.topi(ob('DriveShaftPart').RotX/2+m.pi,0.3,0.5)
Как видно, это выражение запустит «огонь» в свече зажигания при первых 17 градусах (0.3 радиан), установив энергию для этого цикла в 0.5 .
Больше мощности — комбинирование нескольких цилиндров в двигателеКак только мы смоделировали один цилиндр и позаботились о управлении движением отдельных частей, нашим следующим шагом будет дублирование цилиндров, для создания мотора как на вводной иллюстрации этой главы. В принципе мы можем просто выделить все и продублировать, нажав Shift + D, отрегулировав время срабатывания каждого IPO-канала.
Но есть препятствие. Если мы используем Shift + D, вместо Alt + D мы получим одинаковые копии мешей объектов, вместо того чтобы просто воспользоваться ссылкой на первый объект. К тому же, мы ожидаем, что скопировали и остальные атрибуты объекта, такие как материалы, текстуры и IPO. Блендер, по-умолчанию, не дублирует вышеперечисленные категории, копируя только сам объект. Это получится неуклюже, так как изменение IPO первого поршня, к примеру, затронуло бы все остальные.
Мы могли бы сделать остальные копии уникальными впоследствии (нажав на поле количества пользователей этих кривых IPO, например, и подтвердив своё согласие со всплывающим вопросом make single user?), но было бы слишком утомительным повторять это для каждой копии отдельно.
Лучшим способом будет изменить настройки копирования объектов (Duplicate with object) в панели Edit Methods, как показано на скриншоте выше. Таким образом, кривые IPO, связанные с объектом, будут превращены в уникальные копии при дублировании объекта.
Результат нашей работы, четырехцилиндровый двигатель, передающий движение от ведущего вала к поршням доступен как engine001.blend. Изображение анимации доступной по адресу http://vimeo.com/7170769, показано на следующем скриншоте.
Добавление простых ограничений
Ограничения (Constraints) могут быть применены к объектам и костям. В обоих случаях ограничение добавляется вызовом метода append() атрибута constraints. Наш следующий пример покажет, как мы можем ограничить движение стрелок часов из rigged clock (Глава 3, Группы вершин и материалы) для вращения вокруг оси Z. Код, определяющий функции для достижения поставленной задачи начинается с двух определений import, которые уменьшат длину кода:
from Blender.Constraint import Type
from Blender.Constraint import Settings
Функция принимает два аргумента: obbones, ссылка на объект Блендера, данные которого являются арматурой (то есть, не объект арматуры непосредственно) и bone, название кости, которую мы будем ограничивать. Важно понимать, что ограничение, которое мы связываем с костью, является не свойством арматуры, а позой объекта, содержащего арматуру. Множество объектов могут обращаться к одной и той же арматуре, и все позы будут связаны с объектами, таким образом различные объекты, обращающиеся к той же самой арматуре, смогут принимать различные позы.
Итак, стартуя, функция сначала получает позу, а затем ссылку на кость, которую мы хотим ограничить. Выделенная строка показывает, как привязать ограничение (это аналогично тому, как если бы мы связывали ограничение с объектом Блендера вместо кости):
def zrotonly(obbones,bone):
poseob = obbones.getPose()
bigarmpose = poseob.bones[bone]
c=bigarmpose.constraints.append(Type.LIMITROT)
c[Settings.LIMIT]=Settings.LIMIT_XROT|
Settings.LIMIT_YROT
c[Settings.XMIN]=0.0
c[Settings.XMAX]=0.0
c[Settings.YMIN]=0.0
c[Settings.YMAX]=0.0
poseob.update()
Вновь присоединенное ограничение сохраняется в переменную c и в последующих строках видно, что различные атрибуты ограничения, становятся доступны подобно словарю. Сначала мы настраиваем атрибут LIMIT (это битовая маска), для ограничения вращения по осям X и Y. Далее, мы устанавливаем минимальное и максимальное значение вращения вокруг этих осей равным 0.0, таким образом мы останавливаем любое движение. Например, в риггинге реалистичного скелета животного этими значениями можно задать пределы величин вращения к значениям, сопоставимыми с реальными соединениями между костями. И в конце, чтобы сделать изменения pose (позы) видимыми, мы обращаемся к методу update().
Определяем сложные ограничения
Там, где pydrivers предоставляют нам возможность управлять изменением одной IPO-кривой посредством изменения другой, PyConstraints (питон-ограничения) предоставляют нам способы задавать пределы изменения свойств объекта.
Конечно, в Блендер встроено много простых ограничений, таких как мы видели в предыдущем разделе, и часто комбинации простых ограничений достаточно для того, что нам нужно. Но если нам необходимо, чтобы наши объекты перемещались с места на место свободно в пределах не прямоугольной области, а например, для упрощения размещения светофоров и телефонных будок по сетке улиц. Как мы можем достичь этого? Введите pyconstraints.
PyConstraints - Питон-скрипты, которые присутствуют как текстовые блоки в текстовом редакторе Блендера и должны начинаться со строки комментария, идентифицирующей их как ограничение:
#BPYCONSTRAINT
Ограничение на Питоне должно содержать три функции с именами doConstraint(), doTarget(), и getSettings(). Первые двe вызываются в любое время, когда мы двигаем или цель, или ограничиваемый объект, а последняя функция вызывается тогда, когда пользователь щелкает по кнопке Options, которая появляется, как только пользователь выбрал pyconstraint. Следующий скриншот показывает окно Ограничений, как только был выбран pyconstraint.
Самый легкий путь понять, что эти функции делают — посмотреть встроенный шаблон ограничения, который мы можем использовать в качестве основы, чтобы написать наши собственные ограничения. Он доступен в текстовом редакторе по меню Text | Script Templates | Script Constraint. При выборе этого меню будет создан новый текстовый блок, который можно выбрать в выпадающем списке внизу окна текстового редактора.
Шаблон ограничения в БлендереШаблон ограничения содержит также много полезных комментариев, но здесь мы перечислим, по большей части голые функции. Кроме того, шаблон создает окно с фиктивными свойствами. Мы столкнемся со свойствами в следующей части, так что наш пример функции getSettings() здесь будет почти пуст. Как показано, функции будут осуществлять функциональное ограничение, однако, ничего фактически не будет ограничено. Расположение, вращение, и масштаб ограничиваемого объекта останутся без изменений.
def doConstraint(obmatrix, targetmatrices, idprop):
# Выделить компоненты преобразования для быстрого
# доступа.
obloc = obmatrix.translationPart() # перемещение
obrot = obmatrix.toEuler() # вращение
obsca = obmatrix.scalePart() # масштабирование
# код, который реально меняет положение, вращение и
# масштабирование, расположен здесь
# Конвертация обратно в матрицы положения, вращения,
# масштаба,
mtxloc = Mathutils.TranslationMatrix(obloc)
mtxrot = obrot.toMatrix().resize4x4()
mtxsca = Mathutils.Matrix([obsca[0],0,0,0],
[0,obsca[1],0,0],
[0,0,obsca[2],0], [0,0,0,1])
# Рекомбинация отдельных элементов в матрицу
# преобразования.
outputmatrix = mtxsca * mtxrot * mtxloc
# Возвращаем новую матрицу.
return outputmatrix
В функцию doConstraint() передаётся матрица преобразований ограничиваемого объекта и список матриц преобразования для каждого целевого объекта. Она также получает словарь свойств ограничения, к которым можно получить доступ по имени.
Первая вещь, которую мы делаем, - выделяем отдельные компоненты матрицы преобразования — перемещение, вращение, и масштаб ограничиваемого объекта. Частью перемещения будет вектор положения x, y, z, частью масштаба будет вектор масштабирующих коэффициентов вдоль осей x, y, z. Часть вращения будет представлена вектором Эйлера с вращением вокруг трех основных осей. (углы Эйлера очень упрощают работу с вращениями в трехмерном пространстве, но по началу являются довольно трудными для понимания. В википедии есть материал на эту тему http://ru.wikipedia.org/wiki/Углы_Эйлера, но пока что легче думать о углах Эйлера как о вращении вокруг осей x, y, z. Углы Эйлера трудны? Вот от кватернионов реально мозг взрывается! - возмущение пер.) Мы можем разделить любую матрицу преобразования целевого объекта так, как нам нужно, и затем изменить компоненты матрицы преобразования ограничиваемого объекта по своему усмотрению.

