SIM RACING - full mouse control or keyboard and mouse control

for other games (using vJoy / vXbox / ViGEmBus / feeder / XYZ remap) - scroll down or click here!


SLOW INTERNET WARNING: THERE ARE PICTURES!


FULL MOUSE STEERING, THROTTLE & (TRAIL)BRAKING TUTORIAL:

(including but not limited to BeamNG!)


REQUIREMENTS: 1 mouse AND/OR 1 trackball OR 2 mice


  1. MENU > OPTIONS > GAMEPLAY:

  • ABS MODE = REALISTIC ABS ONLY
  • DEFAULT GEARBOX BEHAVIOUR = REALISTIC
  • GEARBOX SAFETY ASSISTANT = OFF
  • CLUTCH ASSISTANT (MANUAL TRANSMISSION) = ON (!1)
  • THROTTLE ASSISTANT (MANUAL TRANSMISSION) = ON (!1)
  • OVERSTEER REDUCTION ASSISTANT = OFF
  • UNDERSTEER REDUCTION ASSISTANT = OFF
  • SLOWER STEERING AT HIGH SPEED = OFF
  • LIMIT STEERING AT HIGH SPEED = OFF
    …
  • DEFAULT IGNITION STATE = OFF (optional)
  • START VEHICLE ENGINES PREHEATED = OFF (optional)
  • START RACE BRAKES PREHEATED = OFF (optional)

(!1) - disable if: A) you are driving ONLY on automatic/DCT/sequential drivetrains B) clutch kicking anyway


  1. MENU > CONTROLS > BINDINGS > VEHICLE:

NOTE: unbind every conflicting key bind!


  • THROTTLE = VERTICAL Y MOUSE AXIS:
    • FILTER = WHEEL (DIRECT)
    • INVERTED AXIS = ON
    • LINEARITY = 1
    • DEADZONE (REST) = 0.5
    • DEADZONE (END) = 0.375


  • BRAKE = VERTICAL Y MOUSE AXIS:
    • FILTER = WHEEL (DIRECT)
    • INVERTED AXIS = OFF
    • LINEARITY = 0.75 (0.75 - 1)
    • DEADZONE (REST) = 0.45
    • (LOWER = trailbrake start, smooth; HIGHER = trailbrake end, rough)
    • DEADZONE (END) = 0.25
    • (LOWER = less pressure, smooth; HIGHER = more pressure, rough)


  • STEERING (AXIS/MOUSE) = HORISONTAL X MOUSE AXIS:
    • FILTER = WHEEL (DIRECT)
    • 1:1 STEERING ANGLE = 0 (!2)
    • INVERTED AXIS = OFF
    • LINEARITY = 1
    • DEADZONE (REST) = 0
    • DEADZONE (END) = 0


  • CLUTCH = LEFT SHIFT:
    • FILTER = KEY (SMOOTH) (!3)

  • PARKING BRAKE (HOLD) = SPACEBAR
    • FILTER = KEY (SMOOTH) (!3)

(!2) - visual only. sets the interior steering wheel steering ratio.
(!3) - smoothens binary input (0 to 1 becomes 0.0 to 1.0).


NOTE: the mouse or trackball has only horisontal and vertical axes, therefore there is no third (3) axis for the clutch pedal. it is (currently) impossible to bind a key and an axis TOGETHER, so that the clutch can only be used by the press of a key (the game’s logic treats combined binary input (0-1) and analogue axis (0-100), e.g. SHIFT + Y axis, as just a binary input (0-1), and even if it works, the input will be stuck with the last value received after you release the key). you could keep using the SHIFT key to clutch kick and/or shift a gear, but you could also use a secondary (2) mouse just to dedicate it to the clutch pedal (internally, mouse no.1 is mouse0 and mouse no.2 is mouse1, etc.).

(ADVANCED) TIP: if (!1) is disabled, you may struggle with shifting with the SHIFT key on manuals. you have to actually rev match with a keyboard and mouse! fortunately, it is much more easier to do with a mouse - because the cursor is at the same axis (therefore, input value) as the clutch and throttle.

  • to UPSHIFT, your mouse position is already revving the engine high enough, so simply hold SHIFT + X + release SHIFT after ~0.1-0.25 sec! if your gear is stuck, immediately depress the clutch pedal again, otherwise you destroy the transmission! unfortunately, it is very difficult (even for me) not to accidentally (or on purpose) dump the clutch, so be aware: at low speeds and/or with poor tyres and/or loose surfaces that wheel spin may occur, however, this could be actually useful for purposeful oversteer - drifting!
  • to DOWNSHIFT, it takes practice to rev match AND brake at the same time, but the basic kb+m version of it is: while on the brakes, simultaneously depress the clutch AND immediately flick your mouse upwards to rev the engine, then downshift, release the clutch, all within less than a second (~0.1-0.5 sec)! interestingly enough, this is not always needed specifically in BeamNG, but is required not to stall the engine.

NOTE2: it is redundant to bind a mouse analogue axis to a handbrake axis. one should purchase a sim racing rig instead.

NOTE3: for the observant ones: the COMBINED THROTTLE&BRAKE bind does NOT allow for trailbraking. if you DONT care about trailbraking and prefer a separate throttle AND brake, use that bind instead. previously this guide featured this bind, but there were simply too many tutorials on the same topic. go watch a youtube video then.

NOTE4: to aid with sensitivity and/or coordination, use UI APPS > ADD APP > PEDALS AND AXIS to see your current input values. i recommend placing it in the middle of the screen.

NOTE5: it goes without saying: but just like with counter strike and other FPS games, set your mouse DPI to VERY LOW or you will lack precision! (if unable, check your system mouse settings)

that is all, folks!


for other games (using vJoy / vXbox / ViGEmBus / feeder / XYZ remap) - SCROLL DOWN!!!)

1 Like

Think you could do a forum tutorial on how to actually drift, not “drift” like sean boswell in the beginning of tokyo drift. I always end up in a ditch, a wall, or spinning out. Or atleast a way to practice

1 Like

richard burns rally (RSF RBR), dirt rally (any), ea sports wrc (any), assetto corsa (any), iracing, rfactor (any), forza horison (any), gran turismo (any), project cars, automibilista (any), farming simulator (any), ea sports f1 (any), trackmania (any), bus driver simulator, my summer car, my winter car, snowrunner, mudrunner, wreckfest (any), ms flight simulator (any and/or VATSIM), x-plane (any), dcs world, war thunder, euro truck simulator, grand theft auto (all your favourite MTA or SAMP stunt jumps), and BLAH BLAH BLAH… you get idea!!!

this is a collection of input remappers and/or feeders, including device drivers (such as virtual joysticks). sry, its a wee bit unorganised!


SLOW INTERNET WARNING: THERE ARE PICTURES!


THE OLD WAY (vJoy only, LEGACY):

THE DEVICE DRIVER (JOYSTICK EMULATOR):

  • vJoy v2.1.8 (Github) - works (win7, win8, win10)
  • vJoy v2.1.9.1 (Github / SourceForge) - works 100%! (win7, win8, win10)
    • installs as an HID device. uninstall via Win+R > appwiz.cpl or C:\Program Files\vJoy\unins000.exe
    • vJoy is a digitally signed 32/64 bit driver.
    • PSA: NEWER versions DID NOT work for me - winutil Win10, march 2025, but they still potentially MAY WORK for your system. tl;dr get v2.1.9.1 instead!
    • NOTE1: on mobile devices, e.g. laptops, vJoy may disable itself to conserve battery. this feature can be turned off in Device Manager > Human Interface Devices > vJoy Device > Energy Management
    • NOTE2: ViGEmBus (see below) is more popular than vJoy.
  • vJoy v2.2.1.1 (Github) - works? (win10, win11)
  • vJoy v2.2.2.0 (Github) - works? (win10, win11)

AND!

THE FEEDER (CONTROLS EDITOR):

  • Virtual Controller (SourceForge)
    • WARNING: may not work for Windows 11 (its trash anyway)
    • translates (feeds) editable inputs of HID devices, e.g. a mouse, to vJoy.
    • do NOT close this feeder during the game (should be minimised instead).
    • uninstall via Win+R > appwiz.cpl or C:\Program Files\Virtual Controller\unins000.exe

alternatives are provided down below. check them all out! ^_^


THE NEW WAY (ViGEmBus, no vJoy):


(i am controlling this with a mouse! INCREDIBLE!!!)

(Win+R > joy.cpl)

  • MouseSteering (Github) - the GUI
    …
  • REQUIRES ViGEmBus (Github) - the driver (it turns your mouse, the relative position of your cursor from the middle of the screen, into a joystick!)
    • ViGEmBus is a digitally signed kernel-mode 64 bit (also 32!) device (bus) driver (for those who are paranoid by insecure software).
    • TRIVIA: ViGEmBus is a fork of vXbox, also known as ScpVBus.
    • easy to uninstall via Win+R > appwiz.cpl
    • ViGEmBus’s XBOX 360 controller shows up ONLY when in use (by a feeder, e.g. MouseSteering). AFAIK emulation of DualShock 4 controller is dependant on the feeder
    • works for Win7 up to Win11. it is deprecated (archived), but still works! ^_^
    • MouseSteering DOES NOT require vJoy installed! feel free to uninstall vJoy!
    • 1:1 linear controls… duh!
    • WRITTEN IN RUST BTW!!! has X, Y & Z axes. (to be precise, XInput button 6 & 7)
    • possible to bind overlapping inputs for trailbraking!
    • also has key bindings to disable any axis on demand.
    • comes in a .zip portable archive (no installation). has a .toml text config.
    • TIP: set snap_input = false in config.toml for unfiltered linear movement.
    • TIP: set edge_scaling = true under [throttle_config] for more sensitive pedals
      (technically edge_scaling option is the deadzone, but i digress)

that is all… but there’s MORE!


OTHER REMAPPERS/FEEDERS/VIRTUAL DEVICES:
(they could be better for YOU!)
LINUX alternatives included!
(sorry, nothing (free) for OSX…)

  • MouseSteering_V1.7.2 (Steam Discussions)
    • a popular autohotkey (aka AHK) (Website) script for mouse steering that only has an X axis.
    • uses RawInput (no input interpolation or smoothing).
    • if you need only the steering via X axis - GET THIS.
    • has a mouse “force feedback” in the form of a “push back” to centre
    • has key binds and input/steering telemetry (input values).
    • TRIVIA: iirc was first scripted for assetto corsa, but then was forked and further developed for dirt rally games. works with ANY game, just like everything else listed here!

  • AntiMicroX (Github)
    • also works on linux!
    • keyboard and mouse to joystick remapping.
    • unless remapping a PHYSICAL joystick, use a VIRTUAL one!
    • i HIGHLY recommend this!

  • InputPlumber (Github)
    • linux only. rust btw!
    • it has EVERYTHING and some more!
    • i HIGHLY recommend this!

  • Xremap (Github)
    • linux only. x11 AND wayland!
    • uses evdev AND uinput!
    • supports mouse and keyboard.

  • Input Remapper (Github)
    • linux only. supports x11 AND wayland!
    • works with mice too!
    • you may also want a device driver to have something to remap - xpadneo (Github) or even Steam Input Configurator (archwiki)!
    • OR simply connect a physical joystick (even a steam deck!).

  • QJoyPad (Github)
    • linux only. supports mouse & keyboard. X11 only!
    • the oldest anarchy remapper (which still works).

  • UCR - Universal Control Remapper (Github) - C# version
    • same features as Virtual Controller (feeder) above.
    • DOES NOT detect keyboard and mouse WITHOUT PLUGINS!
    • previously known as UJR - Universal Joystick Remapper (Github)

  • UCR - Universal Control Remapper (Github) - AHK version
    • has a lot of various input remaps for various devices, including MOUSE!
    • possible to change absolute AND relative modes for mouse deltas!

  • Mouse2Joystick (Github)
    • changes XY coordinates on CONSTANT cursor movement (absolute input mode).
    • movement is limited when near the screen boundaries!
    • boundable / remappable mouse buttons to joystick buttons.
    • DOES NOT require vJoy!

  • mouse2joystick (Github)
    • dont be confused! there are more like these.
    • this one is for linux only. sketchy self-compiling C code.
    • however, steering is hardcoded to be used with held mouse buttons.
    • for other linux feeders and drivers, read further.

  • MouseToJoystick (Github)
    • similar to above, but not really. changes XY value on CONSTANT (speed) movement (absolute input mode).
    • it is a mouse joystick in the most LITERAL sense.
    • the mouse cursor is locked to the centre.
    • double right click to activate / deactivate.

(hidden because bro is advertising ai)

  • x360ce - Xbox 360 Controller emulator (Website / Github)
    • mouse works! supports XInput, as well as other many API’s.
    • has its own built-in virtual joystick emulator (in versions 4.x.x.x).
    • very extensive settings, in fact, THE MOST customisable feeder.
    • works with all joystick emulators, e.g. vJoy, vXbox, ViGEmBus, etc.
    • has 32 and 64 bit versions. digitally SIGNED application! (for those who are paranoid by insecure software)
    • the website is viewed better in austrian version.

  • MTVJ - MouseToVJoy (itchio)
    • mouse steering works, however, throttle and brake is mouse button click only.
    • has separate clutch & handbrake axes. shifting is bound to scroll wheel (weird)

  • msfs_mouse_yoke (Github)
    • standalone python script. windows only.
    • uses X, Y & THROTTLE (bound to mouse wheel) axes.
    • flight simulators only (?)

  • KeyboardSplitterXbox (Github)
    • very very specific feeder. it treats every connected keyboard (virtual or physical) as a separate device (otherwise windows will receive inputs all the same)


  • vJoySerialFeeder (Github)
    • for nerds. also supports linux (uinput).
    • too many â– â– â– â– â– â– â–  buttons, could be scary!

  • map2 (Github)
    • for nerds. linux only.
    • written in rust. easy to configure (python config)

  • FreePIE (Github)
    • for nerds, even more so! python config. windblows only.
    • there are pre-made user-submitted scripts for mouse-to-joystick control…
    • …but sim racers are not coders, so feel free to ignore.

that is all, folks!


legacy vJoy + Virtual Controller tutorial, keeping it for history sake:

  1. install vJoy
    (you may have to restart)

  2. install virtual controller
    (can be any feeder of choice - the list is above)

  3. in Start open / search Configure vJoy
    (C:\Program Files\vJoy\x64\vJoyConf.exe)

  4. configure like so:


    (axis may differ depending on your vJoy version).
    plural of axis is axes, however, for searchability sake,
    i will omit this easily confusing word.

  5. close vJoyConf
    (there can only be one (1) vJoy interface active)

  6. in Start open / search Virtual Controller
    (C:\Program Files\Virtual Controller\VirtualController.exe)
    (next steps may differ depending on your feeder application,
    but essentially they are all the same -
    the goal is to bind / remap mouse XYZ input to vJoy XYZ input)

  7. Settings > IO Devices > Setup > Mouse.
    with this feeder, we will be using the LLHook API (“low level” hook) to feed mouse inputs. this is because other API, such as RawInput will not be able to “lock” the mouse INSIDE the screen edges / bounds (of the window or screen’s native resolution) (not to be confused with the “lock” features in this window), because, as mentioned in the optional trivia, it is a relative input mode, so it sends input data to vJoy infinitely, exceeding the maximum value range. once again, a joystick is both a relative and absolute input device, and the XYZ axis is referring to thumbsticks AND/OR triggers of a joystick (they differ model to model), which usually are relative, however, in this case they are, in fact, absolute, unless you have changed their input mode, so the mouse has no virtual boundaries because it is also a relative device of input. if the joystick always has physical boundaries and limitations to how far it is allowed to go, mouse does not.
    anyway, unfortunately, i have yet to find a better solution on how to make this better, because using the LLHook API (in this particular feeder) comes at a cost - it is NOT CALIBRATED (unless it is not, but make sure!) !!! this basically means that: 1. IT DOES NOT RESPECT NEUTRAL POSITION (centre of the screen), to be precise, it is not directly in the middle of the screen, instead it has “drifted” away to some side. high level API, like XInput, could be better for this matter, but this feeder does not have it. feel free to try another! 2. it may overflow negative or positive value range (below 0 or over 16384 / 32768 / 65536, e.g. -100% or 200%) - example photo of this situation provided below. in this case it would be easier to somehow limit vJoy’s maximum value range, but i think it is impossible without compiling your own vJoy via its SDK and you will be left with an unsigned driver. EDIT: wrong! it would be futile. the value range exceeding problem has to do with input being relative (explained somewhere in this post). if your feeder has an absolute mode for mouse input - use it. nevertheless, luckily, joy.cpl has a calibrate feature, read down below. 3. moreover, you may have noticed there is no XInput or even DirectInput in this feeder whatsoever, instead we are using an LLHook library, which may or may not be even WORSE than DirectInput API (which is also low level and deprecated, pre 2006 era) !!! you may stop and refer to other feeders if this does not suit your needs, as always.


    (API can be RawInput, however, axis input on movement will be choppy and laggy DESPITE the update interval or polling (which can be 1ms, btw), because RawInput NOTORIOUSLY has no input interpolation (smoothing). this is not a problem though, because we are playing a sim racing game, most incredibly! anyway, when using RawInput, all physical HID devices will be shown in the IO Devices menu. 1. untick “Lock Feature” and “Entire Device Lock” if they have been turned on - unless i am wrong, needs testing, maybe not !!! 2. you will need to know the GUID of your mouse, which can be done in Controls > Tools > Quick Binding, or in the Windows’ Device Manager system app)

  8. IO Devices > Setup > vJoy 1


    (completely straightforward, just turn it on)

  9. close IO Devices and go to Settings > Controls > Bind > Create
    remapping / binding / assigning time…


    (Modifier can also be “Increase”, but you will probably have to create another binding with “Decrease” modifier so that it will not change its input value infinitely! the “Set” modifier is BASICALLY the same thing but in one single binding. other feeders follow the same principles, just via different interfaces. but DO note that having different modifiers for the input and the output can have vastly different effects (especially if the virtual joystick is not calibrated - more on that below). however, if you are not into mathematics and experimentation, then simply blindly continue to follow my guide)
    Output Modifier > “Set”
    click Settings > Use Input ON = (%) 100
    this is the steering (or aelirons / rudder),
    where horisontal X axis = left and right mouse position relative to the centre of the screen (neutral position)
    NOTE: oh for ■■■■■ sake, perhaps i should have mentioned this earlier… so some joysticks actually split its value range of an axis in two. left trigger could have a value range from Y0 to Y16384, and right trigger could be Y16384 to Y32768, and vice versa. so, in SOME CASES you will have to split an axis into two halves.

    Input Name: Y
    Output Name: Y
    Output Modifier > “Set”
    Settings > Use Input ON = (%) -100

    ^^^ NEGATIVE MINUS ONE HUNDRED ^^^
    this is the throttle OR braking (or elevators),
    where vertical Y axis = up and down mouse position relative to the centre of the screen (neutral position)
    (it is negative so that Y and Z axis move in opposite directions of each other
    in my experience, the values fed to the Y axis always come inverted (i.e. up is negative, down is positive - you probably dont think that way), so just remember that THIS axis has a negative input!

    NOTE: when using combined (!) bindings in-game, you may not even need to use the third Z axis or assign negative input to it since it is redundant. THIS Z AXIS CAN BE SKIPPED!
    Input Name: Y
    Output Name: Z
    Output Modifier > “Set”
    Settings > Use Input ON = (%) 100
    this is the throttle AND / OR braking (or elevators),
    where mouse vertical Y axis is remapped to joystick Z axis,
    also an up and down mouse input relative to the centre of the screen (neutral position)
    you can simulate the “combined throttle and brake” by adding deadzones to both halves of the screen for Y and Z respectively (to simulate split screen axis like in beamNG), in case there is no “combined” bindings in-game, but im afraid it is not possible with this particular feeder.
    EDIT: you may want to assign an additional key to activate and / or alternate between Y and Z vertical axis (for flight simulators).

  10. close Controls and go back to main window menu, activate (run) the feeder.
    Main > Run

  11. test in Start open / search Monitor vJoy or Win+R > run> joy.cpl.
    (C:\Program Files\vJoy\x64\JoyMonitor.exe)


    (notice Y and Z axis are opposite of each other - which is useful for trailbraking, but NOT for normal driving! again, for those with ADHD: you can use JUST THE Y axis for the split (combined) axis of gas & brake!)
    to edit any settings, first deactivate (stop) the feeder.
    if sensitivity is low, increase it from 100 to 200, 500, 1000, etc.
    ALTERNATIVELY, change your mouse DPI (if possible).
    if it is returning back to the centre of the screen (neutral position), check Mouse API in IO Devices or bindings in Controls, tick / untick “Lock Feature / Entire Device Lock” or better yet, try XInput (modern, high level API) or DirectInput API (deprecated, low level API) (found in other feeders). also make sure they are not “Speed X/Y/Z”, which is “change value only on movement”.
    once again, if there is no response in vJoy Monitor, check your feeder’s bindings.
    however, if nothing works, try another vJoy version (it uninstalls itself, but you can do it manually) AND / OR try another feeder! trust me, it took me as much time and pain to make this work.
    lastly, as mentioned earlier, it IS possible to enable another joystick device, if your goal is to control double or more the amount of the same axis.

  12. IF axis is not fully 0%-100%, you will have to CALIBRATE your virtual joystick device - Win+R > run > joy.cpl > Calibrate > move your mouse all the way to the corners / edges of the SCREEN, not just X/Y/Z > Apply > OK !!!


    (example of Y axis being offset, when it should be 0)

    (example of Z axis being offset, when it should be 100% @ 32768)
    incredibly, Windows has a built-in “calibrate” feature that ACTUALLY works for VIRTUAL joysticks and their axis! do this EVERY TIME your input values are offset / overflowing below 0% or over 100%, as shown on the example above.
    NOTE: Y and Z axis have different value ranges!!!

  13. finally, test in-game, bind / map / assign controls to your new axis!
    FEEDERS SHOULD REMAIN ACTIVE (can be minimised) !!!


    example in Richard Burns Rally, the game:
    Steering > X axis (move your mouse horisontally left or right)
    (Combined) Accelerate and Brake > Y axis (move your mouse vertically up or down)
    if you have bound Y AND Z axis, then use Y for upwards motion, Z for downwards motion!
    you could then additionally bind the shifter to your device of choice.
    now, the in-game combined input splits the axis for us AUTOMATICALLY, so one of them could be more sensitive than the other. if that is the case, you will have to CALIBRATE your virtual joystick again (in Win+R > joy.cpl). my guess is that vJoy (NOT the game!) could have split (initialised and/or detected?) the axis UNEVENLY (due to relativeness and windlows shenanigans), where one half reaches its maximum input value faster than the other axis. so, make sure their value range go precisely FROM 0 TO 16384; FROM 16384 TO 32768; FROM 32768 TO 65536, etc. NOTE: some feeders have built-in calibrators.
    anyway, as usual, if there are no such (combined) bindings in your game, then you will have to come up with your own bindings via the feeder. so, back in the feeder’s bindings and controls you would want to somehow “split” the screen into two axis, where middle is the neutral position for Y and Z (Y0, Z0), where Z is inverted, so its Z0 starts in the centre, not at the bottom of the screen. this is something that i was previously completely stuck on with this feeder, virtual controller, so MAYBE you are better off using another feeder (scroll up for the list). this was honestly a nightmare to figure out myself, so i wish you the best of luck!!!
    EDIT: x360ce’s FAQ section has a guide on how to split the axis into two!

  14. if nothing worked and you are panicking and â– â– â– â– â– â– â– â–  yourself > uninstall vJoy via Win+R > appwiz.cpl (C:\Program Files\vJoy\unins000.exe) and try other options!

i really encourage you to try the other feeders if youve had a bad experience! i also recommend you to install linux! ^_^


little known fun fact: did you know that the playstation 2’s dualshock 2 & 3 controllers have analogue pressure-sensitive directional buttons? they are the first and the last controllers to ever feature analogue action buttons that are NOT triggers. when dualshock 4 came out, pressure-sensitive action buttons were considered redundant, since the rise of 2 trigger + 2 stick formula. this makes “button mashing” have less meaning nowadays. please keep your playstation 2 alive! jailbreak it!

P.S. feel free to share or do anything with this

<3