Render.ru
Поддержать

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

Tweak239

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

Имеется велосипедная цепь и две звезды, а так же ось большой звезды.
Цепь анимируется при помощи 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
Если объект $Sprocket это объект "звезда", тогда в скрипте используй объект "ось" вместо объекта $Sprocket ("звезда"😉.

Tweak239

Активный участник
Рейтинг
17
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 объектов: объект "велосипед" (родитель=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
igorznag
Спасибо большое, теперь всё работает.
Получается проблема была в том, что не было Position Constraint? Странно.

igorznag

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

Tweak239

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