- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Написание скриптов для Blender 2.49 - Michel Anders
Шрифт:
Интервал:
Закладка:
В этих случаях отношения между объектами могут быть определены Питон-выражением или так называемым pydriver. Управляющий объект принимает IPO-канал другого объекта как входной параметр и возвращает результат, управляющий IPO-каналом на текущем объекте. Поскольку эти выражения на Питоне имеют доступ к полному API Блендера, взаимоотношения могут быть действительно очень сложными.
Ограничения на Питоне (PyConstraints)
Там, где управляющие объекты могут использоваться, чтобы обходить пределы встроенных возможностей Блендера по управлению IPO-каналами, PyConstraints позволяют нам преодолеть трудности в ситуациях, где встроенные ограничения не достаточны. Например, невозможно ограничить положение одного объекта на поверхности другого, если в нем есть отверстия. Встроенные ограничения предлагают способы ограничивать расположение объекта не ниже чем расположен другой объект (ограничение floor). Но если мы хотели бы, чтобы была возможность изменять позицию объекта ниже поверхности другого объекта в местах, где есть отверстия, мы должны запрограммировать такое ограничение самостоятельно. Как мы увидим, PyConstraints позволяют нам сделать точно это.
Поскольку все вступительные замечания позади, мы наконец снова можем вернуться к программированию в следующем абзаце.
Установка времени - один управляет всеми
Как использовать часы, если невозможно установить время удобным способом? Вместо перемещения каждой стрелки часов отдельно, мы хотели бы поворачивать единственную кнопку, чтобы перемещать обе стрелки — большую (минутную) и маленькую (часовую), причем (очевидно) часовая стрелка должна перемещаться в двенадцать раз медленнее минутной.
Поэтому, мы должны определить объект-кнопку (которую мы скорее всего не будем визуализировать), для управления вращением костей в стрелках часов.
Чтобы настроить ведомые каналы, выполним шаги:
1. В окне 3D View, выберите объект bighand (большая стрелка).
2. В окне редактора IPO-Кривых удостоверьтесь что выбран тип IPO – object. Справа вы увидите список IPO-каналов. Выберите RotZ, щелкнув на нем левой кнопкой мышки.
3. Выберите Curve | Transform Properties. В появившемся окне нажмите на кнопку Add Driver.
4. Не закрывая Transform Properties, выберите Curve | Insert 1:1 mapping и затем щелкните по Default one-to-one mapping. В редакторе IPO появится прямая светло-голубая линия.
5. В окне Transform Properties, нажмите на изображение светло-зеленого питона. Изображение станет темно-зеленым, и теперь возможно редактировать выражение pydriver в смежной текстовой области. Введите туда следующий код:
ob('Knob').RotZ*(360/(2*m.pi))/10
Вот и все! Теперь, если вращать кнопку вокруг оси Z, большая стрелка следует примеру. Все же pydriver-выражение действительно нуждается в некотором разъяснении. Выделенная часть является движком (driver) - канал объекта (object channel), обеспечивающий входные данные для управления IPO-каналом. ob('Knob') является укороченной записью (стенографией), позволенной в pydriver-выражениях для Блендера. Object.Get('Knob') и атрибут RotZ дают нам вращение вокруг оси Z. Это вращение задано в радианах, тогда как результат pydriver-выражения для канала вращения (RotZ) должен быть в градусах, поэтому мы умножаем на 360 и делим на удвоенное число пи (m.pi = 3.14). Наконец, мы делим полученное число в градусах на десять, потому что по некоторой неясной причине, Блендер не принимает градусы, не поделенные на 10! (Заметьте, что это "делить на десять" действительно нужно только для каналов вращения по осям, но не для любого из других каналов!)
1-on-1 mappings
Вы можете задаться вопросом, почему мы должны были сначала вставить кривую 1:1. Отношение между ведомым каналом и его управляющим объектом содержит еще один слой и это - кривая, транслирующая значение на выходе управляющего объекта (pydriver) в финальное значение. Эту кривую можно изменять вручную, но обычно мы делаем всю точною настройку в нашем pydriver и просто вставляем кривую 1-к-1. Такой вариант работы настолько распространен, что Блендер обеспечивает специальный интерфейс для этой ситуации, так как весьма утомительно создавать необходимые кривые снова и снова для каждого управляемого канала.
Конечно, мы, возможно, достигли бы того же самого результата, ведя вращение напрямую через канал вращения объекта knob, или даже с помощью копии ограничения вращения. Это спасло бы нас от странных проблем преобразования, но цель этого абзаца показать основы.
Часовая стрелка из примера, - вот где использование pydriver действительно является правильным решением. (Хотя, изменяя непосредственно IPO-кривую, мы могли бы изменить темп изменения управляющего канала, но это было бы не столь же ясно, как простое выражение, и почти невозможно для более сложных отношений между объектами). Мы повторяем список действий, показанных ранее, но теперь для маленькой (часовой) стрелки и введем следующее pydriver-выражение:
ob('Knob').RotZ*(360/(2*m.pi))/10/12
Поскольку часовая стрелка в двенадцать раз медленней, чем минутная, мы используем то же самое pydriver-выражение что и для минутной стрелки, но разделим результат на двенадцать. Теперь, когда мы вращаем объект knob (кнопку) по ее оси Z, минутная стрелка будет следовать как и раньше, а часовая соответственно в 12 раз медленнее. Вместо того, чтобы вручную вращать кнопку, также возможно анимировать вращение кнопки, для анимации обеих стрелок часов. Полный результат доступен как clock-pydriver.blend, изображение часов с кнопкой, показано на следующем скриншоте:
СокращенияВ пределах pydriver-выражений можно использовать некоторые полезные сокращения, чтобы экономить на печатании. В пошаговом примере мы уже использовали сокращение ob('<name>') — это обращение к объектам Блендера по имени, аналогично, возможно получить доступ к Меш-объектам и материалам посредством me('<name>') и ma('<name>') соответственно. Кроме того, модуль blender доступен как b, модуль Blender.Noise как n, и модуль Питона math как m. Он позволяет выражениям использовать тригонометрические функции, такие как синус, например. Этих возможностей достаточно, чтобы покрыть много проблем, но их все равно не хватит если мы захотим, например, импортировать внешние модули. Есть путь избежать этих трудностей, мы его увидим в следующем абзаце.
Преодоление ограничений: pydrivers.py
Поле ввода для pydrivers ограничено 125 символами, и даже при том, что сокращения позволяют получить доступ к модулю Питона math и к некоторым из модулей Блендера, с помощью сокращённых выражений, предоставленного места достаточно мало. Кроме того, поскольку pydrivers должны быть выражениями Питона, весьма трудно отлаживать их (например, потому что Вы не можете вставить функцию print) или добавить нечто похожее на функциональность if/then. Последний пример до некоторой степени может быть преодолен хитрыми уловками, основанными на том факте, что Истина (True) и Ложь (False) в Питоне преобразуются в, соответственно, 1 и 0 внутри числового выражения, таким образом утверждение:
if a>b:
c=14
else:
c=109
эквивалентно:
c = (a>b)*14 + (a<=b)*109
Однако чувствуется неуклюжесть выражения, ведь мы оцениваем условие дважды. К счастью, и проблему пространства и ограничение единственного выражения можно преодолеть при использовании текстового блока с именем pydrivers.py. Если такой текстовый блок присутствует, его содержание доступно в виде модуля с именем p. Так, например, если мы определяем функцию clamp() (зажим) в pydrivers.py таким образом:
def clamp(a,low,high):
if a<low : a=low
if a>high: a=high
return a
Мы можем вызвать эту функцию в нашем pydriver-выражении как p.clamp (a, 14,109).
Мы будем использовать pydrivers.py в следующих примерах, не только потому, что это позволит применять более сложные выражения, но также и потому что ширина pydriver области еще меньше чем ее длина, что делает такое выражение очень трудным к прочтению, поскольку Вы должны постоянно пользоваться прокруткой для доступа ко всем частям выражения.
Внутреннее сгорание — корреляция сложных изменений

