Меня очень интересует раскачка кабины скриптом. Физическая анимация дело понятное - можно задать какую угодно траекторию. Но гораздо интереснее когда не нужно заморачиваться с физической анимацией, а можно сделать скриптом.
Цель создания этой темы:
- лучше понять принцип алгоритма;
- коллективно обсудить возможные варианты улучшения.
- поэкспериментировать с различными параметрами, предложить параметры, которые дают большую реалистичность.
В исходной версии качалки от 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 кабину так сильно не колбасило. Как идея - может быть подбирая в зависимости от скорости величину амплитуды можно управлять интенсивностью раскачки на той или иной скорости?
Еще как идея - а может в зависимости от той или иной величины скорости можно вообще задавать разные математические функции расчета траектории?
У кого какие будут интересные идеи по улучшению качалки?
Попробуйте на каком-нибудь локе поставить функцию качалки с моей измененной величиной амплитуды. Не знаю кому как, а лично мне после этих изменений кататься с раскачиванием очень понравилось.