Мы могли бы сделать остальные копии уникальными впоследствии (нажав на поле количества пользователей этих кривых 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.
Читать дальше