NWH Wheel Controller 3D
Search Results for

    Show / Hide Table of Contents

    FAQ

    Warning: Before going through this troubleshooting guide please check that you have the latest version of the asset. This can be done through Window > Package Manager.

    Vehicle physics is behaving weirdly (jitter, jumping, etc.).

    • Check the model rotation as per the Fixing Model Rotation guide.
    • Check the model scale. The root object of the vehicle and WheelControllers should have a scale of [1,1,1].
    • Check that the vehicle inertia is adequate. Sometimes when a model that has the wheels far out (e.g. a 1x1x1 cube with wheels 1 meter away from it) the automatically calculated inertia is too low for the suspension stiffness, physics update rate and default friction settings so the vehicle can become unstable. You can fix this by inputting the inertia values manually into the Rigidbody after unticking the automatic inertia calculation. Typical values are:
      • X (roll): 1000-2500
      • Y (yaw): 3000-5000
      • Z (pitch): 2000-4000
    • Too low physics update rate for stiff suspension, friction or low inertia. This can be fixed by lowering the fixed delta time in the project settings. Check the "Why is physics update rate so important?" section below for more info. It is usually better to fix the settings instead of bumping this up due to the performance cost, although the recommended is 100Hz physics (dt = 0.01).

    Vehicle is not reacting to the input.

    • Check that there is a SceneInputProvider script present in the scene. The full name will depend on the input method used, e.g. RewiredSceneInputProvider or InputSystemSceneInputProvider.
    • If using the included CarController, check that the CarController component is enabled.
    • Check that input is being received by looking at the CarController component in the inspector during play mode - the input values should react to keyboard/gamepad input.
    • If using a custom controller, verify that you're reading input correctly and applying motor/brake/steer values to the WheelController components.

    How to make the vehicle feel more arcade?

    Wheel Controller 3D is by default set up more towards realism / simcade style of vehicles and tries to be as physically accurate as possible. However, sometimes games require a more arcade approach. Here are a few tweaks to get more arcade behavior:

    • Create a custom FrictionPreset for arcade handling:
      • Lower B (stiffness) parameter to reduce snap oversteer (e.g., B=6-8 instead of 10)
      • This will reduce the tendency of the vehicle to suddenly lose traction
      • Adjust the curve to be more linear with a flatter peak for more forgiving handling
      • Higher D (peak value) if you want more overall grip (e.g., D=1.2-1.5)
      • Assign this preset to WheelController > Active Friction Preset
    • Set the center of mass to be a bit lower than realistic, e.g. a few centimeters above the floor of the vehicle. This will reduce leaning in the corners.
    • Reduce the Rigidbody inertia to make the vehicle change direction more easily and feel more like an RC car. Overdoing it might cause instabilities and jitter.
    • For more details on adjusting friction presets, see the FrictionPreset documentation.

    How to improve mobile performance?

    Here are optimization tips for mobile devices:

    • Use Project Settings > Time > Fixed Delta Time of 0.02 or 0.033.
    • Use vehicles with low poly meshes for collision and visuals.
    • Use the Sphere cast type in StandardGroundDetection instead of Multicast for faster ground detection (~0.02ms vs ~0.03-0.05ms per wheel).
    • Lower the Target Effective Rate in WheelControllerManager (try 100Hz instead of 200Hz) to reduce the number of physics substeps.
    • Reduce the number of active WheelController components on screen at once.
    • For distant or AI vehicles, consider using simpler physics or disabling wheels entirely.

    Why is physics update rate so important?

    This is because the physics updates in discrete intervals (each X seconds, e.g. 0.02s by default) which means that the vehicle travels certain distance in between the frames, where there is no physics update. At 450 km/h, for example, that is 125 m/s or 2.5 meters traveled between the frames when using Time.fixedDeltaTime of 0.02 (50Hz physics update). In comparison, only a few cm of sideways travel on the tire can result in slip reaching the peak value and going over it, resulting in reduced friction due to the way tires work on hard surfaces in general. So, there are two ways to get around this:

    • Increase the update rate by decreasing the Fixed Delta Time. This can be done through Project Settings > Time > Fixed Delta Time:
      • 0.03 (33Hz) - Lower end mobile devices. Low physics quality.
      • 0.02 (50Hz) - Default. Adequate for <100km/h.
      • 0.01667 (60Hz) - Suitable for most use cases. Average physics quality.
      • 0.01 (100Hz) - PC, high quality.
      • 0.005 (200Hz) - PC simulators.
    • Make the simulation a bit looser so that the tire can have a bit more play before resulting in loss of friction. This can be done by creating a custom FrictionPreset with a lower B (stiffness) parameter (e.g. 6-8 instead of 10).

    Note: WheelController uses internal substepping (via WheelControllerManager) to run wheel physics at higher rates than Unity's fixed timestep. The Target Effective Rate setting allows wheel physics to run at 200Hz even when Unity's physics runs at 50Hz, improving stability without the full cost of increasing the global physics rate.

    How do I handle different surfaces (asphalt, gravel, ice)?

    Create multiple FrictionPreset assets with different BCDE parameters for each surface type, then switch the activeFrictionPreset on wheels when they contact different surfaces:

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Gravel"))
        {
            foreach (WheelController wheel in wheels)
                wheel.activeFrictionPreset = gravelPreset;
        }
    }
    

    See the FrictionPreset documentation for typical parameter values for different surfaces.

    Why does my vehicle slide when parked on a slope?

    The static friction system should prevent this. Check:

    • Ensure Static Friction Strength is greater than 0 in the StandardFriction component
    • Increase Static Longitudinal Stiffness for steeper slopes
    • Make sure the vehicle has come to a complete stop (the static friction engages below the speed threshold)

    See the FrictionPreset documentation for more details on the static friction system.

    How do I integrate force feedback for steering wheels?

    WheelController provides aligningMoment and tireScrub properties on each wheel. Sum the aligning moments from the front (steering) wheels and use that for steering resistance. Use tireScrub for vibration effects when tires are sliding.

    See the Force Feedback section in WheelController documentation for code examples.

    • Edit this page
    In this article
    Back to top Copyright © NWH - Vehicle Physics, Aerodynamics, Dynamic Water Physics