Considering c_move() allows for both absolute movement and relative movement, I can't really think of a reason why not to use it(alongside c_rotate()) in absolute. C_move() just translates your mathematical movement while adding collision.
For suspension, I use 5 c_traces. One for each wheel, and one for the chassis. The chassis is rotated according to the avergae of the wheel traces. The chassis trace is to detect things like turbo boosts ect. The suspension is limited so it cannot go to far up or down.
I set up my kart as 2 entities. One contains the chassis and wheels. The wheels and chassis all have bone joints. This entity is passable. The second entity is the collision entity, it's basically a cube. This entity does all my physics work(movement ect.). The level is passable, as I've set up invisible collision walls. This keeps things simple. For kart-kart collision, I keep the karts moving into eachother as passable. By using a scan, I detect karts, then use math to "bounce" the kart in the proper direction.
While my game is arcade racing(think Mario Kart), perhaps some of this might help you in your realistic racing. I applaud you for developing your own physics system, it's quite an undertaking to do right(drifting, gravity mechanics, ect.), but well worth it in the end(one of the best things I did was ditch the physics engine).
