1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Анимация", создана пользователем Tongue, 24 мар 2014.

Модераторы: Артер
  1. Tongue

    Tongue Активный участник

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

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

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    Если уже всё анимировано, можно в Curve Editor выпрямить графики(сделать все ключи острыми Set Tangents To Linear)
    А можно перед анимацией, на всех треках осей у Position XYZ и у осей Euler XYZ поставить вместо Bezier Float , Linear Float. Тогда все ключи будут острыми автоматически.
     
  3. Tongue

    Tongue Активный участник

    С нами с:
    01.01.2008
    Сообщения:
    71
    Симпатии:
    13
    Баллы:
    7

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

    Вложения:

    • 3312565.jpg
      3312565.jpg
      Размер файла:
      251,8 КБ
      Просмотров:
      97
  4. Tongue

    Tongue Активный участник

    С нами с:
    01.01.2008
    Сообщения:
    71
    Симпатии:
    13
    Баллы:
    7
    В общем есть манипулятор, который движется по прямому рельсу туда-сюда-обратно. И надоело каждый раз подбирать его скорость движения. Она ж у него постоянная. Хотелось бы простое решение)))))
     
  5. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    86
    Баллы:
    73
    вообще ничего не понятно
    Скорость - это фукция времени и расстояния, таким образом если обьект за одно и то-же время проходит одинаковый путь, скорость будет одной и той-же, отсюда я делаю вывод, что ты неверно сформулиловал вопрос - тебе нужно избавиться от ускорения, и добиться равноускоренного движения
    Однако ускорение не берётся из ниоткуда - если твой ползунок часть какого нибудь кривошипно-шатунного механизма, то равномерное вращение крутяйщейся части неизбежно приводит к тому, что линейная скорость шатуна будет меняться по синусоиде, и так далее
     
  6. Tongue

    Tongue Активный участник

    С нами с:
    01.01.2008
    Сообщения:
    71
    Симпатии:
    13
    Баллы:
    7
    Ну может я сложно объясняю, но на деле все просто. Манипулятор движется по рельсу (простую схему приложил). Нужно перемещать его по разным точка на рельсе (с 1 по 5). Ускорением пренебрегаем, манипулятор либо движется со скоростью V либо стоит на месте. (ключи все линейные) Но вот когда начинаешь ставить ключи в точках 1-5, нужно угадывать, в какое время манипулятор туда доберется. Ну то есть на глаз делаешь. А хотелось бы точно знать, на каких кадрах поставить ключ, чтобы манипулятор всегда двигался со скоростью V. Хоть бери да дели расстояние на скорость на калькуляторе и ставь ключ в этом времени )))
     

    Вложения:

    • 3312610.jpg
      3312610.jpg
      Размер файла:
      201,5 КБ
      Просмотров:
      103
  7. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Создаем калькулятор в 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"
     
  8. Tongue

    Tongue Активный участник

    С нами с:
    01.01.2008
    Сообщения:
    71
    Симпатии:
    13
    Баллы:
    7
    Да! Супер! Именно то что нужно! Добавляю в библиотеку со скриптами!
     
Модераторы: Артер

Поделиться этой страницей