My-library.info
Все категории

Michel Anders - Написание скриптов для Blender 2.49

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Michel Anders - Написание скриптов для Blender 2.49. Жанр: Программы издательство неизвестно, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Написание скриптов для Blender 2.49
Автор
Издательство:
неизвестно
ISBN:
нет данных
Год:
неизвестен
Дата добавления:
17 сентябрь 2019
Количество просмотров:
254
Читать онлайн
Michel Anders - Написание скриптов для Blender 2.49

Michel Anders - Написание скриптов для Blender 2.49 краткое содержание

Michel Anders - Написание скриптов для Blender 2.49 - описание и краткое содержание, автор Michel Anders, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
Расширьте мощность и гибкость Блендера с помощью Питона: высокоуровневого, легкого для изучения скриптового языка

Написание скриптов для Blender 2.49 читать онлайн бесплатно

Написание скриптов для Blender 2.49 - читать книгу онлайн бесплатно, автор Michel Anders

Внутреннее сгорание — корреляция сложных изменений

Предположим, что мы хотим продемонстрировать, как работает четырехтактный двигатель внутреннего сгорания. У такого двигателя есть множество движущихся частей, и многие из них связаны сложным образом.

Чтобы увидеть отношения между частями двигателя, будет полезно взглянуть на следующую иллюстрацию. На скриншоте перечислены названия, которые мы будем использовать, когда обратимся к различным частям мотора. (Я не автомобильный инженер и не механик, таким образом названия, возможно, не точны, но по крайней мере мы будем говорить об одних вещах. За дополнительной информацией Вы можете обратиться сюда 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-вида)

Для самого шатуна можно использовать то же выражение для LocZ-канала, но нужно так тщательно сделать соединение поршня и шатуна, чтобы они точно совпадали.

Однако, движение шатуна не ограничено только перемещением по оси Z, так как он вращается вокруг оси X с центром в точке, соединяющей шатун с поршнем. Угол вращения (γ на диаграмме) можно вывести из значений L, R, и α:

def topa(l,r,a):

    Q=q(l,r,a)

    ac=acos((Q**2+l**2-r**2)/(2*Q*l))

    if a%(2*pi)>pi : ac = -ac

    return -ac

Pydriver выражение для RotX будет выглядеть вот так:

m.degrees(p.topa(1.542,0.655,ob('DriveShaftPart').RotX))/1 0.0

Впускной и выпускной клапаны управляются вращением их соответствующих распределительных валов. Очертание кулачка очень сложно, так что здесь мы используем не фактическую форму его контура, а аппроксимируем ее, она выглядит достаточно хорошо (то есть, открытый клапан в функции еще оживленное движение в правильном моменте). Следующая картинка показывает движение клапана как функцию от угла вращения:




Наконец, в pydrivers.py мы определяем функцию spike(), которая принимает угол поворота распределительного вала как аргумент и возвращает значение между 0.0 и 1.0 которое резко возрастает в районе нулевого угла:

def spike(angle):

    t = (cos(angle)+1.0)/2.0

    return t**4

Сейчас клапан движется линейно, но линия, по которой он следует, наклонена на 10 градусов (вперед для впускного клапана, назад для выпускного клапана), теперь нам придется управлять двумя каналами, LocZ и LocY, каждый нужно умножить  на правильное значение для создания наклонного движения. Поэтому мы определим две функции в pydrivers.py:

def valveZ(angle,tilt,travel,offset):

    return cos(radians(tilt))*spike(angle)*travel+offset

def valveY(angle,tilt,travel,offset):

    return sin(radians(tilt))*spike(angle)*travel+offset

Обе функции возвращают расстояние в зависимости от угла поворота управляющего  объекта. Tilt (наклон) - наклон клапана (в градусах), travel — максимальная длина пути, по которому проходит клапан вдоль наклонной линии, а offset (компенсация) - значение, которое позволяет регулировать позицию клапана. Соответствующие pydriver-выражения для LocZ и LocY-каналов впускного клапана:

p.valveZ(ob('CamInlet').RotX+m.pi,-10.0,-0.1,6.55)

и

p.valveY(ob('CamInlet').RotX+m.pi,-10.0,-0.1,-0.03)

(Выражения для выпускного клапана аналогичны, но с положительным углом tilt.)

До сих пор, все IPO-каналы были каналами объекта, такими как расположение и вращение. Но также возможно управлять другими каналами, ведь нам нужно изменять энергию лампы, помещенной в свечу зажигания. В pydrivers.py мы для начала определим вспомогательную функцию  topi(), которая, в качестве аргументов, кроме угла вращения движущегося объекта принимает угол h (в радианах) и интенсивность i. topi() возвращает эту интенсивность, если угол двигающегося объекта находится между 0 и h, и ноль, если угол выйдет за  пределы этого ряда. Поскольку угол на входе функции, возможно больше, чем 2*pi (когда двигающийся объект пройдет больше чем полный круг), мы исправляем это выделенной операцией деления по модулю:

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)


Michel Anders читать все книги автора по порядку

Michel Anders - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


Написание скриптов для Blender 2.49 отзывы

Отзывы читателей о книге Написание скриптов для Blender 2.49, автор: Michel Anders. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.