From b5cfda8253680631fa5e8797dba682c59fa36bd3 Mon Sep 17 00:00:00 2001 From: Miloslav Ciz Date: Fri, 6 Dec 2024 01:25:43 +0100 Subject: [PATCH] Unstick car from walls --- racing.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/racing.h b/racing.h index f5d773b..8dd35e2 100644 --- a/racing.h +++ b/racing.h @@ -806,8 +806,6 @@ printf("------\n"); /* friction is in the direction if the axis and its magnitude is determined by the dot product (angle) of the axis and velocity */ - - TPE_Vec3 fric = TPE_vec3Times(ja,(TPE_vec3Dot(ja,jv) * _LCR_applyMaterialFactor(LCR_CAR_STEER_FRICTION,groundMat)) / TPE_F); @@ -817,6 +815,20 @@ printf("------\n"); LCR_racing.carBody.joints[i].velocity[1] = jv.y; LCR_racing.carBody.joints[i].velocity[2] = jv.z; } + + /* The following fixes "sticking to a wall" issue by adding a small spin + to the car when trying to steer at very small velocity. */ + if (steering && + (input & (LCR_RACING_INPUT_FORW | LCR_RACING_INPUT_BACK)) && + (LCR_racing.wheelCollisions & 0x0f) && + LCR_racingGetCarSpeedUnsigned() < (LCR_GAME_UNIT / 25)) + { + LCR_LOG2("spinning car a bit"); + + TPE_bodySpin(&LCR_racing.carBody,TPE_vec3(0, + steering == ((input & LCR_RACING_INPUT_LEFT) != 0) ? + TPE_F / 32 : -1 * TPE_F / 32,0)); + } } if ((!(input & LCR_RACING_INPUT_LEFT)) &&