+ Ответить в теме
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 38

Тема: Скриптовая раскачка. Идеи и обсуждение

  1. #1
    Разработчик Trainz UP Аватар для proton2
    Регистрация
    21.09.2009
    Страна
    Адрес
    Saint-Petersburg
    Возраст
    40
    Сообщений
    1,136

    По умолчанию Скриптовая раскачка. Идеи и обсуждение

    Меня очень интересует раскачка кабины скриптом. Физическая анимация дело понятное - можно задать какую угодно траекторию. Но гораздо интереснее когда не нужно заморачиваться с физической анимацией, а можно сделать скриптом.

    Цель создания этой темы:
    - лучше понять принцип алгоритма;
    - коллективно обсудить возможные варианты улучшения.
    - поэкспериментировать с различными параметрами, предложить параметры, которые дают большую реалистичность.

    В исходной версии качалки от Tram'a на небольших скоростях раскачки вообще не ощущалось. Тем не менее коглда едешь на реальном локе колебания кабины есть и на небольших скоростях. Этого очень не хватает в TRS, не может лок на малой скорости ехать как по ровной плоскости.
    Этот скрипт раскачивает лок и кабину, но не раскачивает тень. В итоге на больших скоростях при качании тень выпирает...

    Вот исходный вариант качалки Трама:

    thread void K_loop()
    {
    Bogey[] bog_l = GetBogeyList();

    float R_level, J_level=0;

    while(1)
    {
    float veh_vel=Math.Fabs(GetVelocity())*3.6;

    if(veh_vel>20)
    {
    float maxAmpl=0.15*Math.Fmin(0.00015*(veh_vel-20),0.045); //амплитуду менять тут
    R_level=R_level+Math.PI*Math.Rand(0.10,0.15);
    int a= (int)(R_level/(2*Math.PI));
    R_level=R_level-2*a*Math.PI;

    float value1=maxAmpl* sin(R_level);

    SetMeshOrientation("default",0,value1,0);
    bog_l[0].SetMeshOrientation("default",0,-value1,0);
    bog_l[1].SetMeshOrientation("default",0,-value1,0);

    J_level=J_level+Math.PI*Math.Rand(0.11,0.13);
    a= (int)(J_level/(2*Math.PI));
    J_level=J_level-2*a*Math.PI;

    maxAmpl=maxAmpl*1.2;

    value1=maxAmpl*sin(J_level);
    SetMeshTranslation("default",0,0,value1);
    bog_l[0].SetMeshTranslation("default",0,0,-value1);
    bog_l[1].SetMeshTranslation("default",0,0,-value1);
    }

    else if(veh_vel>19)
    {
    SetMeshOrientation("default",0,0,0);
    SetMeshTranslation("default",0,0,0);
    }
    Sleep(0.05);
    }
    }


    Меня очень интересует эта тема и я попробовал ее поковырять.
    Во-первых изменил амплитуду. Раньше там была величина 0.00015, я ее увеличил до 0.00035

    float ampl_const = 0.00035;
    float maxAmpl=0.15*Math.Fmin(ampl_const*(veh_vel-20),0.045);


    Раскачка изменила свое поведение. На малых скоростях стало ощущаться колебание кабины, похожее на реальность. По мне так это здорово добавило реализма. Колебания кабины очень не хватало.

    Вот полный исходный код чуть измененной функции раскачки на которой катаюсь я.
    На сколько я понял (и отразил в коментариях) суть этой скриптовой раскачки - поворот на заданную величину У и одновременное подпрыгивание на заданную величину по оси Z. Если я не до конца понял суть, пожалуйста, поправьте меня.

    thread void K_loop() // качание
    {
    Bogey[] bog_l= GetBogeyList();
    float R_level=0; //rotate level?
    float J_level=0; // jump level?

    while(1)
    {
    float ampl_const = 0.00035;
    float veh_vel=Math.Fabs(GetVelocity())*3.6; // для расчета амплитуды берем скорость

    if(veh_vel>20) // с какой скорости начинаем качку
    {
    float maxAmpl=0.15*Math.Fmin(ampl_const*(veh_vel-20),0.045); //формула регулировки апмлитуды
    R_level=R_level+Math.PI*Math.Rand(0.10,0.15);
    int a= (int)(R_level/(2*Math.PI));
    R_level=R_level-2*a*Math.PI; //rotate level по оси У

    float value1=maxAmpl* sin(R_level); // расчет величины для оси У

    // если правильно понимаю - rotation корпуса по оси у
    SetMeshOrientation("default",0,value1,0);

    //rotation телег по оси У
    bog_l[0].SetMeshOrientation("default",0,-value1,0);
    bog_l[1].SetMeshOrientation("default",0,-value1,0);

    J_level=J_level+Math.PI*Math.Rand(0.11,0.13);
    a= (int)(J_level/(2*Math.PI));
    J_level=J_level-2*a*Math.PI;

    maxAmpl=maxAmpl*1.2;

    value1=maxAmpl*sin(J_level); // расчет значения для оси Z, подпрыгивание по оси Z?
    SetMeshTranslation("default",0,0,value1); //смещение корпуса по оси Z
    bog_l[0].SetMeshTranslation("default",0,0,-value1);
    bog_l[1].SetMeshTranslation("default",0,0,-value1);
    }
    else
    if(veh_vel>19)
    {
    SetMeshOrientation("default",0,0,0);
    SetMeshTranslation("default",0,0,0);
    }
    Sleep(0.05);
    }
    }


    В качестве идеи дальнейшего обсуждения:

    можно задать несколько условий скорости, и для каждого из условий использовать свою константу амплитуды, например:

    if (veh_vel>10 and veh_vel<19) ampl_const = 0.00045;
    else if (veh_vel>19 and veh_vel<50) ampl_const = 0.00035;
    else if ((veh_vel>50 and veh_vel<80) ampl_const = 0.00025;


    Это сделано для того, чтобы на скоростях больше 50 кабину так сильно не колбасило. Как идея - может быть подбирая в зависимости от скорости величину амплитуды можно управлять интенсивностью раскачки на той или иной скорости?
    Еще как идея - а может в зависимости от той или иной величины скорости можно вообще задавать разные математические функции расчета траектории?

    У кого какие будут интересные идеи по улучшению качалки?

    Попробуйте на каком-нибудь локе поставить функцию качалки с моей измененной величиной амплитуды. Не знаю кому как, а лично мне после этих изменений кататься с раскачиванием очень понравилось.
    Последний раз редактировалось proton2; 02.02.2013 в 11:55.
    Сделано наспех - сделано на смех!

  2. #2
    Пользователь Аватар для TRam_
    Регистрация
    22.09.2009
    Возраст
    29
    Сообщений
    15,128

    По умолчанию

    Цитата Сообщение от proton2 Посмотреть сообщение
    У кого какие будут интересные идеи по улучшению качалки?
    в 12ой версии можно определять скорость вращения кузова относительно оси z (другими словами кривизну кривой). Если потратиться на ресурсы, то можно сделать чтоб лок в прямых не раскачивался, а в кривых "колбасило", особенно когда их проходят с превышением...

    Еще как идея - а может в зависимости от той или иной величины скорости можно вообще задавать разные математические функции расчета траектории?
    можно написать всё что угодно. Моя раскачка написана для вагонов, чтобы одновременно раскачивать все движущиеся вагоны на карте - чего-то более простого чем эта придумать сложно. А усложнить для уточнения всегда можно .

  3. Сказал спасибо:


  4. #3
    Разработчик Trainz UP Аватар для proton2
    Регистрация
    21.09.2009
    Страна
    Адрес
    Saint-Petersburg
    Возраст
    40
    Сообщений
    1,136
    Автор

    По умолчанию

    Я не имею ввиду что качалка TRam'а плохая. Честно говоря именно этот метод лично мне нравится больше всего - не нужно мучиться с анимацией в максе да и код скрипта простой и понятный.
    Люблю когда все просто и понятно - значит любой может использовать.

    Лично для моего восприятия такого раскачивания кабины вполне хватает для игровой имитации.

    Цитата Сообщение от TRam_ Посмотреть сообщение
    в 12ой версии можно определять скорость вращения кузова относительно оси z (другими словами кривизну кривой).
    За эту мысль большое спасибо. Для сбора идей я и созывал консилиум
    А какой функцией и как это можно сделать? Есть где-нибудь пример?
    Сделано наспех - сделано на смех!

  5. #4
    Пользователь Аватар для Эрендир
    Регистрация
    13.01.2010
    Страна
    Адрес
    Я Бот, живу в сети :)
    Возраст
    35
    Сообщений
    6,240

    По умолчанию

    Вот только не задача, эта раскачка чувствительна для fps. На что делать с помощью неё раскачку кабины, по меньшей мере глупо. Лучше потратить своё время и сделать полноценную анимацию качания в максе, что будет и реалистичнее для конкретного лока, и меньше будет есть ресурсы.

  6. Сказали спасибо: (2)


  7. #5
    Разработчик Trainz UP Аватар для proton2
    Регистрация
    21.09.2009
    Страна
    Адрес
    Saint-Petersburg
    Возраст
    40
    Сообщений
    1,136
    Автор

    По умолчанию

    За информацию спасибо. Хорошо когда известны все плюсы и минусы.

    Есть у кого-нибудь наглядные результаты сравнения - какой fps выдает игра при включенной качалке и какой при выключенной качалке? Интересно взглянуть на сколько эта качалка жрет fps.
    Сделано наспех - сделано на смех!

  8. #6
    Пользователь Аватар для TRam_
    Регистрация
    22.09.2009
    Возраст
    29
    Сообщений
    15,128

    По умолчанию

    Цитата Сообщение от Эрендир Посмотреть сообщение
    Лучше портратить своё время и сделать полноценную анимацию качания в максе
    качание в максе нельзя сделать одинаковой частоты при различной амплитуде (либо перебрасывать анимацию с кадра на кадр, как делается сейчас). Хотя как вариант можно наделать кучу файлов с анимацией раскачивания и затухания этого раскачивания, в виде эффектов.

    Опять же мне не нравится, что локомотив не отображается из кабины... Ну когда я наконец смогу выглянуть из окна? (это требует синхронной анимации кузова и кабины)

  9. Сказал спасибо:


  10. #7
    Разработчик Аватар для Рома
    Регистрация
    17.10.2012
    Страна
    Адрес
    Уфа
    Возраст
    25
    Сообщений
    3,554

    По умолчанию

    А есть скриптовая раскачка не чувствительная к фпс? Как ее вообще отвязать от фпс?
    Путь длиной в тысячу миль пройден на треть.

  11. #8
    Пользователь Аватар для TRam_
    Регистрация
    22.09.2009
    Возраст
    29
    Сообщений
    15,128

    По умолчанию

    Цитата Сообщение от Рома Посмотреть сообщение
    Как ее вообще отвязать от фпс?
    она слабо чувствительна к fps. Другое дело что если раскачивать кузов, которому привязана кабина (как сделано выше), то камера вместе с кабиной раскачиваются почти синхронно, но с дрожанием (эффект прислонения головы к стенке). Решение - отделить точку привязки кабины в отдельную мешь, установить в 0,0,0 кузова, и скриптом задавать раскачку отдельно кузову, отдельно кабине (когда пользователь в ней сидит). Получится как в 2010ом, где был такой же эффект, и раскачивание в кабине выглядело плавным.

  12. #9
    Разработчик Аватар для Рома
    Регистрация
    17.10.2012
    Страна
    Адрес
    Уфа
    Возраст
    25
    Сообщений
    3,554

    По умолчанию

    У меня дрожать начинает когда скорость выше 110-120 км/ч. До этого все плавно

    ---------- Сообщение добавлено в 16:57 ---------- Предыдущее сообщение размещено в 16:56 ----------

    Кстати, можно ли как-то убрать дрожь, если отвязать точку кабины от лока нет возможности?
    Путь длиной в тысячу миль пройден на треть.

  13. #10
    Пользователь Аватар для TRam_
    Регистрация
    22.09.2009
    Возраст
    29
    Сообщений
    15,128

    По умолчанию

    Цитата Сообщение от Рома Посмотреть сообщение
    если отвязать точку кабины от лока нет возможности?
    возможность есть - в hex редакторе попортить имя точки. желания написать это пока нет - для отображения кабины и кузова в виде "1" нужно сделать убираемой мешь low-poly кабины.

  14. Сказал спасибо:


+ Ответить в теме
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения