Render.ru

Анимация велосипедной цепи

Tweak239

Активный участник
Рейтинг
17
#1
Не хотелось создавать новую тему, но темы "мелкие вопросы", или что-то в этом роде, я не обнарудил.

Имеется велосипедная цепь и две звезды, а так же ось большой звезды.
Цепь анимируется при помощи Dummy, запущенного по пути, на контроле процента прохождения пути стоит float_script следующего содержания:

dependsOn $Sprocket.rotation.controller
sp_rot=$Sprocket.rotation.controller.X_Rotation
28.0/73.0*sp_rot/360

28 - количество зубцов, 73 - количество звеньев цепи.
Вращаем звезду - всё прекрасно работает

Сама звезда прилинкована к оси.
Вращаем ось - звезда вертится, а цепь стоит на месте...
Вопрос - почему?
Я предполагаю, что неправильно задал переменную sp_rot.

Буду несказанно рад вашей поддержке.
Прикреплённая к ветке тема "Мелкие вопросы" значительно снизит количество подобных тем.
 

Вложения

igorznag

Мастер
Рейтинг
103
#2
Если объект $Sprocket это объект "звезда", тогда в скрипте используй объект "ось" вместо объекта $Sprocket ("звезда").
 

Tweak239

Активный участник
Рейтинг
17
#4
igorznag
Да, Sprocket - это звезда, но проблема не в том, какой объект использовать, понятно, что можно просто ось взять а как сделать именно такую цепь событий, как у велосипеда - педали - ось - звезда - цепь - звезда - колесо. Не поверю, что так нельзя.

iVAt
В этом уроке вообще задаётся изначально анимация гусеницам танка, от которой уже зависит вращение колёс.

На мой взгляд, суть в том, что выражение $Sprocket.rotation.controller.X_Rotation обращается непосредственно к вращению звезды при помощи гизмо, то есть к контроллеру Euler_XYZ, который не учитывает поворот от связи (link) с осью.

Хотя нет, если на контроллер вращения звезды (Sprocket) поставить float script:

dependsOn $Cranks_Axis.rotation.controller
ca_rot=$Cranks_Axis.rotation.controller.X_Rotation
ca_rot

то есть прямая зависимость от вращения оси (Cranks_Axis), и крутить ось - цепь всё равно стоит неподвижно. Как так?
 

igorznag

Мастер
Рейтинг
103
#5
Простой пример. В сцене есть 5 объектов: объект "велосипед" (родитель=SceneRoot), объект "ось" (родитель=объект "велосипед"), объект "звезда" (родитель=объект "велосипед"), объект "Dummy-цепь" (родитель=SceneRoot), объект "сплайн-путь" (родитель=объект "велосипед").
1. Выдели объект "звезда", примени к нему Position Constraint и в качестве Target выбери объект "ось".
2. На контроллер вращения объекта "звезда" поставь float script:
Код:
dependsOn $Cranks_Axis.rotation.controller 
ca_rot=$Cranks_Axis.rotation.controller.X_Rotation 
DegToRad(ca_rot)
3. Выдели объект "Dummy-цепь", примени к нему Path Constraint и в качестве Target выбери объект "сплайн-путь".
4. На контроллер процента прохождения пути объектом "Dummy-цепь" поставь float_script:
Код:
dependsOn $Sprocket.rotation.controller 
sp_rot=$Sprocket.rotation.controller.X_Rotation 
28.0/73.0*sp_rot/360
5. Вращай объект "ось".
 

Tweak239

Активный участник
Рейтинг
17
#6
igorznag
Спасибо большое, теперь всё работает.
Получается проблема была в том, что не было Position Constraint? Странно.
 

igorznag

Мастер
Рейтинг
103
#7
Сама звезда прилинкована к оси.
Проблема была в том, что нужно объект "звезда" прилинковать не к объекту "ось", а к объекту "велосипед". Объект "ось" и объект "звезда" должны иметь общий родитель (объект "велосипед"). Position Constraint нужно было применить к объекту "звезда" (Target = объект "ось"), чтобы объект "звезда" перемещался во время перемещения объекта "ось".
 

Tweak239

Активный участник
Рейтинг
17
#8
есть книга, в которой можно прочитать про это подробнее?
что бы понимать как оно работает более детально?
 
Сверху