Michel Anders - Написание скриптов для Blender 2.49
- Название:Написание скриптов для Blender 2.49
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Michel Anders - Написание скриптов для Blender 2.49 краткое содержание
Расширьте мощность и гибкость Блендера с помощью Питона: высокоуровневого, легкого для изучения скриптового языка
Написание скриптов для Blender 2.49 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Преодоление ограничений: 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
if a>high: a=high
return a
Мы можем вызвать эту функцию в нашем pydriver-выражении как p.clamp (a, 14,109).
Мы будем использовать pydrivers.py
в следующих примерах, не только потому, что это позволит применять более сложные выражения, но также и потому что ширина pydriverобласти еще меньше чем ее длина, что делает такое выражение очень трудным к прочтению, поскольку Вы должны постоянно пользоваться прокруткой для доступа ко всем частям выражения.
Внутреннее сгорание — корреляция сложных изменений
Предположим, что мы хотим продемонстрировать, как работает четырехтактный двигатель внутреннего сгорания. У такого двигателя есть множество движущихся частей, и многие из них связаны сложным образом.
Чтобы увидеть отношения между частями двигателя, будет полезно взглянуть на следующую иллюстрацию. На скриншоте перечислены названия, которые мы будем использовать, когда обратимся к различным частям мотора. (Я не автомобильный инженер и не механик, таким образом названия, возможно, не точны, но по крайней мере мы будем говорить об одних вещах. За дополнительной информацией Вы можете обратиться сюда http://en.wikipedia.org/wiki/Four-stroke_cycle.)
camshaft – распределительный вал
outlet valve – выпускной клапан
inlet valve – впускной клапан
cylinder – цилиндр
piston – поршень
connecting rod – шатун
drive shaft – ведущий или коленчатый вал
Прежде, чем мы начнем формировать части, чтобы использовать их вращение и положение, для управления другими частями, нужно условиться: в реальности поршни в цилиндрах двигаются за счет расширения воспламененного топлива, они толкают ведущий вал (или коленчатый вал) с соединенным маховым колесом и распределительным валом (или в нашем случае с некоторыми механизмами, которые не показаны здесь), движение возвращается к распределительному валу, который управляет движением выпускных и впускных клапанов. Очевидно, что мы не можем следовать этой концепции непосредственно, поскольку нет никакого топлива как объекта, который стимулирует двигаться другие объекты, таким образом имеет смысл полностью изменить цепь отношений. В нашей установке маховое колесо будет вращать ведущий вал и различные механизмы, а ведущий вал, в свою очередь, будет вести большинство других объектов, включая поршень и его шатун. Мы будем также управлять энергией лампы, помещенной в наконечник свечи зажигания, вращая ведущий вал.
Ведущий вал просто будет следовать за вращением махового колеса, как более медленный механизм (это можно осуществить с помощью ограничения copy rotation объекта, но здесь мы всё хотим осуществить через pydrivers). Соответствующий pydriversдля канала RotX
будет похож на это:
ob('Flywheel').RotX/(2*m.pi)*36
Это может выглядеть неуклюжим, но необходимо помнить - вращения сохраняются в радианах, в то время как pydriver-выражения должны возвращать вращение в градусах, поделенных на 10.
Высшая передача и оба распределительных вала будут также следовать за вращением махового колеса, но со скоростью, уменьшенной в два раза и с противоположным направлением вращения:
m.degrees(ob('Flywheel').RotX*-0.5)/10.0
Чтобы проиллюстрировать, как получить доступ к функциям в математическом модуле Питона math
, мы не стали преобразовывать в градусы самостоятельно, а воспользовались функцией degrees()
, поставляемой с модулем math
.
Мы смоделировали распределительный вал с кулачком, указывающим точно вниз. Если мы хотим управлять вращением по оси X распределительного вала на входе посредством вращения ведущего вала, мы должны принять во внимание, что он двигается на половинной скорости. Кроме того, его задержки вращения немного отстают, чтобы соответствовать циклу воспламенения цилиндра, поскольку он открывает входной клапан на начальном движении вниз и закрывает клапан как раз перед искрой воспламенения:
ob('DriveShaftPart').RotX/(2*m.pi)*18+9
Выражение для распределительного вала на выходе почти идентично за исключением времени запаздывания (здесь 24, но настройка этого двигателя не совсем соответствует реальной механике):
ob('DriveShaftPart').RotX/(2*m.pi)*18+24
Движение поршня ограничено только по вертикали, но его точное движение более сложно для вычисления. Нас интересует длина отрезка Q— смотрите предыдущий рисунок — и расстояние между центром ведущего вала и точкой, где шатун ( Lна диаграмме) соединяется с поршнем. Поскольку длина шатуна постоянна, изменение Qбудет функцией от угла поворота α ведущего вала. Расстояние от центра ведущего вала, до точки, где шатун связан с ведущим валом, фиксировано. Мы назовем это расстояние R. Теперь у нас есть треугольник со сторонами Q, L, и Rи известен угол α. Поскольку три из этих данных (L, R, и α) известны, мы можем вычислить Q, при использовании теоремы косинусов ( http://ru.wikipedia.org/wiki/Теорема_косинусов). Поэтому мы определяем функцию q()
в файле pydrivers.py
, которая возвращает длину Q, при заданных L, R, и α:
def q(l,r,a): return r*cos(a)+sqrt(l**2-(r*sin(a))**2)
Выражение для канала поршня LocZ
просто обращается к этой функции с соответствующими значениями аргументов:
p.q(1.542,0.655,ob('DriveShaftPart').RotX)
Точные значения для Lи Rбыли взяты из меша, используя координаты соответствующих вершин шатуна и ведущего вала в окне Transform Properties
. (кнопка N в окне 3D-вида)
Интервал:
Закладка: