Render.ru

Постоянная скорость движения

Tongue

Активный участник
Рейтинг
15
#1
Всем привет!
Есть задача: анимировать движущиеся части механизмов с постоянной скорость. Всякие бегунки по прямым направляющим, каретки и тд. Все движеться по прямым линиям и с одинаковой скоростью, без ускорений (есть даже значение скорости)
Так вот, подбирать ключи на глаз не удобно и не очень точно. Как бы этот процесс подгонять автоматически?
По сути у нас есть начальная точка движения и конечная. И скорость, с какой движется объект по прямой. А вот время движения и подбираю "на глаз". Как бы сделать так, чтобы объект на всех таких отрезках (а их несколько) всегда двигался с одинаковой скоростью и это было удобно анимировать? (как много всегда хочется) :)

Кто знает как решить задачку?
 

INCUS

Знаток
Рейтинг
29
#2
Если уже всё анимировано, можно в Curve Editor выпрямить графики(сделать все ключи острыми Set Tangents To Linear)
А можно перед анимацией, на всех треках осей у Position XYZ и у осей Euler XYZ поставить вместо Bezier Float , Linear Float. Тогда все ключи будут острыми автоматически.
 

Tongue

Активный участник
Рейтинг
15
#3
Если уже всё анимировано, можно в Curve Editor выпрямить графики(сделать все ключи острыми Set Tangents To Linear)
А можно перед анимацией, на всех треках осей у Position XYZ и у осей Euler XYZ поставить вместо Bezier Float , Linear Float. Тогда все ключи будут острыми автоматически.

Да, это уже сделано. Но проблема глубже. Как на всех отрезках анимации сделать движение объекта с одинаковой скоростью? Вот приложил пример. Имеем 3 отрезка, на которых объект движется. Но на них он движется с разной скоростью ( видно по разным углам наклона кривой) Как анимировать одинаковую скорость на всех трех отрезках? Сейчас я делаю это на глаз, двигая ключи по таймбару, но хотелось бы найти способ, чтобы объект всегда двигался с одной и той же заданной скоростью.
 

Вложения

Tongue

Активный участник
Рейтинг
15
#4
В общем есть манипулятор, который движется по прямому рельсу туда-сюда-обратно. И надоело каждый раз подбирать его скорость движения. Она ж у него постоянная. Хотелось бы простое решение)))))
 

maiden666

Мастер
Рейтинг
112
#5
вообще ничего не понятно
Скорость - это фукция времени и расстояния, таким образом если обьект за одно и то-же время проходит одинаковый путь, скорость будет одной и той-же, отсюда я делаю вывод, что ты неверно сформулиловал вопрос - тебе нужно избавиться от ускорения, и добиться равноускоренного движения
Однако ускорение не берётся из ниоткуда - если твой ползунок часть какого нибудь кривошипно-шатунного механизма, то равномерное вращение крутяйщейся части неизбежно приводит к тому, что линейная скорость шатуна будет меняться по синусоиде, и так далее
 

Tongue

Активный участник
Рейтинг
15
#6
вообще ничего не понятно
Скорость - это фукция времени и расстояния, таким образом если обьект за одно и то-же время проходит одинаковый путь, скорость будет одной и той-же, отсюда я делаю вывод, что ты неверно сформулиловал вопрос - тебе нужно избавиться от ускорения, и добиться равноускоренного движения
Однако ускорение не берётся из ниоткуда - если твой ползунок часть какого нибудь кривошипно-шатунного механизма, то равномерное вращение крутяйщейся части неизбежно приводит к тому, что линейная скорость шатуна будет меняться по синусоиде, и так далее
Ну может я сложно объясняю, но на деле все просто. Манипулятор движется по рельсу (простую схему приложил). Нужно перемещать его по разным точка на рельсе (с 1 по 5). Ускорением пренебрегаем, манипулятор либо движется со скоростью V либо стоит на месте. (ключи все линейные) Но вот когда начинаешь ставить ключи в точках 1-5, нужно угадывать, в какое время манипулятор туда доберется. Ну то есть на глаз делаешь. А хотелось бы точно знать, на каких кадрах поставить ключ, чтобы манипулятор всегда двигался со скоростью V. Хоть бери да дели расстояние на скорость на калькуляторе и ставь ключ в этом времени )))
 

Вложения

igorznag

Мастер
Рейтинг
103
#7
Хоть бери да дели расстояние на скорость на калькуляторе и ставь ключ в этом времени )))
Создаем калькулятор в 3d max. Простой пример:
В новой сцене создаем один чайник-Teapot и перемещаем его в начальную точку-1.
Запускаем скрипт. В новом окне устанавливаем скорость и нажимаем кнопку Set Initial Keys.
Выделяем и перемещаем чайник в конечную точку-2. Нажимаем кнопку Set Keys
Выделяем и перемещаем чайник в конечную точку-3. Нажимаем кнопку Set Keys ...
Код:
try destroydialog speed_constant catch()
rollout speed_constant "Speed Constant"
(
spinner sp_x "X:" range:[-1e9, 1e9, 0.0] fieldwidth:60 type:#worldunits pos:[5,5]
spinner sp_y "Y:" range:[-1e9, 1e9, 0.0] fieldwidth:60 type:#worldunits pos:[100,5]
spinner sp_z "Z:" range:[-1e9, 1e9, 0.0] fieldwidth:60 type:#worldunits pos:[200,5]
spinner sp_speed "Speed (units/frame):" range:[0, 1e9, 0.0] fieldwidth:60 type:#worldunits pos:[20,65]
button btn_set_initial_keys "Set Initial Keys" pos:[100,30]
button btn_set_keys "Set Keys" pos:[200,50] width:80 height:40
on  speed_constant open do
(sp_x.enabled=false;sp_y.enabled=false;sp_z.enabled=false;)
on  btn_set_initial_keys pressed do
(
if selection.count==1 then
(
obj=selection[1];c=obj.pos.controller;
k=addNewKey c[1].controller slidertime; k.inTangentType=#linear;k.outTangentType=#linear;
k=addNewKey c[2].controller slidertime; k.inTangentType=#linear;k.outTangentType=#linear;
k=addNewKey c[3].controller slidertime; k.inTangentType=#linear;k.outTangentType=#linear;
sp_x.value=c.value[1];sp_y.value=c.value[2];sp_z.value=c.value[3];
)--if selection.count==1 then
)--on  btn_set_initial_keys pressed do
on  btn_set_keys pressed do
(
if selection.count==1 then
(
obj=selection[1];c=obj.pos.controller;n=numKeys c;
if n > 0 then
(
last_frame=getKeyTime c n
pos1=[sp_x.value,sp_y.value,sp_z.value]
pos2=c.value; dist=distance pos1 pos2
obj_speed=sp_speed.value; 
if obj_speed > 0 then
(
frames_count=floor(dist/obj_speed); last_frame_new=last_frame+frames_count
k=addNewKey c[1].controller last_frame_new; k.inTangentType=#linear;k.outTangentType=#linear;
k=addNewKey c[2].controller last_frame_new; k.inTangentType=#linear;k.outTangentType=#linear;
k=addNewKey c[3].controller last_frame_new; k.inTangentType=#linear;k.outTangentType=#linear;
sp_x.value=c.value[1];sp_y.value=c.value[2];sp_z.value=c.value[3];
if animationRange.end < last_frame_new then animationRange = interval animationRange.start last_frame_new
slidertime=last_frame_new; c.value=pos1; animate on at time last_frame_new c.value=pos2
)
)--if n > 0 then
)--if selection.count==1 then
)--on  btn_set_keys pressed do
); createdialog speed_constant 300 100
Чтобы запустить скрипт нужно:
1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
2. Сохраняем текстовый файл с названием "test.ms"
3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
 

Tongue

Активный участник
Рейтинг
15
#8
Цитата Tongue #6:Хоть бери да дели расстояние на скорость на калькуляторе и ставь ключ в этом времени )))
Создаем калькулятор в 3d max.
Да! Супер! Именно то что нужно! Добавляю в библиотеку со скриптами!
 
Сверху