ПрограммированиеФорумФизика

Проблемы с физикой 2д машины из статьи "Физика автомобиля для игр"

#0
19:38, 3 июня 2008

Сделал физику авто так как она реализована в статье на этом сайте "Физика автомобиля для игр", сделал все как в исходниках... практически скопировал исходники, но почемуто машина не едет а кружится на месте и дрожит... тоесть не какого то либо движения при повороте машина хаотично двигается в разные стороны... нормально она едет только по прямой, но когда нажимаю на тормоз (переменная car_throttle приравнивается 0, а car_brake приравнивается к 100) машина начинает дрожать и крутится немного, ниже привожу исходник функции которая считает каждый кадр физику, заранее спасибо!

#define  DRAG    5.0         /* factor for air resistance (drag)   */
#define  RESISTANCE  30.0      /* factor for rolling resistance */
#define CA_R    -5.20      /* cornering stiffness */
#define CA_F    -5.0      /* cornering stiffness */
#define MAX_GRIP  2.0        /* maximum (normalised) friction force, =diameter of friction circle */


void Update()
{
  sn = Math.sin(car_angle);
  cs = Math.cos(car_angle);

  // SAE convention: x is to the front of the car, y is to the right, z is down
  
  // transform velocity in world reference frame to velocity in car reference frame
  velocity_x =  cs * car_velocity_wc_y + sn * car_velocity_wc_x;
  velocity_y = -sn * car_velocity_wc_y + cs * car_velocity_wc_x;

// Lateral force on wheels
//  
  // Resulting velocity of the wheels as result of the yaw rate of the car body
  // v = yawrate * r where r is distance of wheel to CG (approx_ half wheel base)
  // yawrate (ang_velocity) must be in rad/s
  //
  yawspeed = car_cartype_wheelbase * 0.5 * car_angularvelocity;  

  if( velocity_x == 0 )    // TODO: fix singularity
    rot_angle = 0;
  else
    rot_angle = Math.atan2( yawspeed, velocity_x);

  // Calculate the side slip angle of the car (a_k_a_ beta)
  if( velocity_x == 0 )    // TODO: fix singularity
    sideslip = 0;
  else
    sideslip = Math.atan2( velocity_y, velocity_x);    

  // Calculate slip angles for front and rear wheels (a_k_a_ alpha)
  slipanglefront = sideslip + rot_angle - car_steerangle;
  slipanglerear  = sideslip - rot_angle;

  // weight per axle = half car mass times 1G (=9_8m/s^2) 
  weight = car_cartype_mass * 9.8 * 0.5;  
  
  // lateral force on front wheels = (Ca * slip angle) capped to friction circle * load
  flatf_x = 0;
  flatf_y = CA_F * slipanglefront;
  flatf_y = Math.min(MAX_GRIP, flatf_y);
  flatf_y = Math.max(-MAX_GRIP, flatf_y);
  flatf_y *= weight;
  if(front_slip)
    flatf_y *= 0.5;

  // lateral force on rear wheels
  flatr_x = 0;
  flatr_y = CA_R * slipanglerear;
  flatr_y = Math.min(MAX_GRIP, flatr_y);
  flatr_y = Math.max(-MAX_GRIP, flatr_y);
  flatr_y *= weight;
  if(rear_slip)
    flatr_y *= 0.5;

  // longtitudinal force on rear wheels - very simple traction model

  ftraction_x = 100*(car_throttle - car_brake*velocity_x);  
  ftraction_y = 0;
  if(rear_slip)
    ftraction_x *= 0.5;

// Forces and tor2 on body
  
  // drag and rolling resistance
  resistance_x = -( RESISTANCE*velocity_x + DRAG*velocity_x*Math.abs(velocity_x) );
  resistance_y = -( RESISTANCE*velocity_y + DRAG*velocity_y*Math.abs(velocity_y) );

  // sum forces
  force_x = ftraction_x + Math.sin(car_steerangle) * flatf_x + flatr_x + resistance_x;
  force_y = ftraction_y + Math.cos(car_steerangle) * flatf_y + flatr_y + resistance_y;  

  // tor2 on body from lateral forces
  tor2 = car_cartype_b * flatf_y - car_cartype_c * flatr_y;

// Acceleration
  
  // Newton F = m_a, therefore a = F/m
  acceleration_x = force_x/car_cartype_mass;
  acceleration_y = force_y/car_cartype_mass;
  
  angular_acceleration = tor2 / car_cartype_inertia;

// Velocity and position

  // transform acceleration from car reference frame to world reference frame
  acceleration_wc_x =  cs * acceleration_y + sn * acceleration_x;
  acceleration_wc_y = -sn * acceleration_y + cs * acceleration_x;

  // velocity is integrated acceleration
  //
  car_velocity_wc_x += delta_t * acceleration_wc_x;
  car_velocity_wc_y += delta_t * acceleration_wc_y;

  // position is integrated velocity
  //
  
    
  car_position_wc_x += delta_t * car_velocity_wc_x;
  car_position_wc_y += delta_t * car_velocity_wc_y;
  


// Angular velocity and heading

  // integrate angular acceleration to get angular velocity
  //
  car_angularvelocity += delta_t * angular_acceleration;

  // integrate angular velocity to get angular orientation
  //
  car_angle += delta_t * car_angularvelocity ;
    
    
    
    
    

}
#1
19:57, 3 июня 2008

Copy-Paste must die

А вообще попробуй разобраться с масштабированием различных переменных - возможно из-за этого. Надо самому писать такие вещи, ща вот скока времени на такое гавно потратишь, в итоге наверняка всё перепишешь ))

Но всё-таки, мне кажется на первый взгляд, что надо масштабировать. У тебя наверное машина в несколько раз меньше, чем в том туториале, вот и слишком резко всё, проскоки нуля("дрожжание") и так далее и тому подобное.

#2
20:06, 3 июня 2008

Alexander K
>Но всё-таки, мне кажется на первый взгляд, что надо масштабировать. У тебя
>наверное машина в несколько раз меньше, чем в том туториале, вот и слишком
>резко всё, проскоки нуля("дрожжание") и так далее и тому подобное.
даже если взять машину как точку для которой не важны размеры, даже без поворота почемуто при торможении когда ftraction_x становится отрицательным машина вдруг начинает дрожать и поворачивать... хотя я никаким образом не менял угол поворота руля (car_steerangle). Мне кажеться что проблемма с вычислением углов но где она не могу понять

#3
20:19, 3 июня 2008

Alexander K
ты был прав... с торможением разобрался delta_t я поставил 0.5 а нужно 0.1 или 0.01 тогда не происходит "проскоков нуля". но вот поворачивть машина все равно не хочет, при любом повороте она начинает перемешаться по маленькому кругу. гдето ошибка в вычислении поворота? не могу понять помогите пожалуста

#4
22:55, 3 июня 2008

Alexander K
Cпасибо.. действительно проблеммы с маштабированием.

#5
20:07, 5 июня 2008

lebron
>Cпасибо.. действительно проблеммы с маштабированием.
А проблема то решена?

#6
17:35, 6 июня 2008

Alexander K
Да проблема решена

Но столкнулся новой проблемой. Хочеться реализовать правильную физику работы двигателя и коробки передач (Такую как например в NFS Underground 2). Подскажите статьи по этой теме или исходники.

Если более конкретно то проблема заключается в том что не получается сделать так чтобы при 5 передаче скорость была больше чем при первой.. коэф передач для 1-ой 2.66 а для 5-ой 0.05 за счет этого так как этот коэф используется в уравнении расчета силы двигателя и получается что при повышенной передаче двигатель дает меньшую скорость чем при пониженной.. мне кажеться что я чего то не понимаю.. обьясните пожалста формула по которой считаю силу двигателя: Сила=крутящий момент * коэф передачи * коэф диференц * кпд/радиус колеса

Крутяший момент (Tengine) определяю так Tengine = (car_throttle/100)* (max_rpm/hoursepower);

ПрограммированиеФорумФизика

Тема в архиве.