Сделал физику авто так как она реализована в статье на этом сайте "Физика автомобиля для игр", сделал все как в исходниках... практически скопировал исходники, но почемуто машина не едет а кружится на месте и дрожит... тоесть не какого то либо движения при повороте машина хаотично двигается в разные стороны... нормально она едет только по прямой, но когда нажимаю на тормоз (переменная 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 ; }
Copy-Paste must die
А вообще попробуй разобраться с масштабированием различных переменных - возможно из-за этого. Надо самому писать такие вещи, ща вот скока времени на такое гавно потратишь, в итоге наверняка всё перепишешь ))
Но всё-таки, мне кажется на первый взгляд, что надо масштабировать. У тебя наверное машина в несколько раз меньше, чем в том туториале, вот и слишком резко всё, проскоки нуля("дрожжание") и так далее и тому подобное.
Alexander K
>Но всё-таки, мне кажется на первый взгляд, что надо масштабировать. У тебя
>наверное машина в несколько раз меньше, чем в том туториале, вот и слишком
>резко всё, проскоки нуля("дрожжание") и так далее и тому подобное.
даже если взять машину как точку для которой не важны размеры, даже без поворота почемуто при торможении когда ftraction_x становится отрицательным машина вдруг начинает дрожать и поворачивать... хотя я никаким образом не менял угол поворота руля (car_steerangle). Мне кажеться что проблемма с вычислением углов но где она не могу понять
Alexander K
ты был прав... с торможением разобрался delta_t я поставил 0.5 а нужно 0.1 или 0.01 тогда не происходит "проскоков нуля". но вот поворачивть машина все равно не хочет, при любом повороте она начинает перемешаться по маленькому кругу. гдето ошибка в вычислении поворота? не могу понять помогите пожалуста
Alexander K
Cпасибо.. действительно проблеммы с маштабированием.
lebron
>Cпасибо.. действительно проблеммы с маштабированием.
А проблема то решена?
Alexander K
Да проблема решена
Но столкнулся новой проблемой. Хочеться реализовать правильную физику работы двигателя и коробки передач (Такую как например в NFS Underground 2). Подскажите статьи по этой теме или исходники.
Если более конкретно то проблема заключается в том что не получается сделать так чтобы при 5 передаче скорость была больше чем при первой.. коэф передач для 1-ой 2.66 а для 5-ой 0.05 за счет этого так как этот коэф используется в уравнении расчета силы двигателя и получается что при повышенной передаче двигатель дает меньшую скорость чем при пониженной.. мне кажеться что я чего то не понимаю.. обьясните пожалста формула по которой считаю силу двигателя: Сила=крутящий момент * коэф передачи * коэф диференц * кпд/радиус колеса
Крутяший момент (Tengine) определяю так Tengine = (car_throttle/100)* (max_rpm/hoursepower);
Тема в архиве.