SIM RACING - full mouse control and vehicle dynamics

THIS WORKS WITH ANY GAME: richard burns rally (RSF), dirt rally, ea sports wrc, assetto corsa rally, iracing, ride, rfactor, forza horison, gran turismo, project cars, raceroom racing experience, carx drift racing, automibilista, farming simulator, ea sports f1, trackmania, need for speed, ridge racer, midnight club, genki racing project, tokyo xtreme racer, wipeout, ballisticng, mario kart, test drive, bus driver simulator, my summer car, my winter car, snowrunner, mudrunner, wreckfest, ms flight simulator, VATSIM, x-plane, dcs world, war thunder, euro truck simulator, grand theft auto, and BLAH BLAH BLAH… YOU’RE WINNER!!!

COLLECTION OF VIRTUAL JOYSTICKS (GAMEPADS) AND STEERING WHEELS (EMULATORS), INPUT REMAPPERS, INPUT FEEDERS & BUS (DEVICE) DRIVERS:

like a virtual (on-screen) keyboard that your phone has! except this one is a “mouse controlled” joystick/gamepad, see?

SLOW INTERNET WARNING: THERE ARE PICTURES!


THE NEW METHOD (no vJoy):

virtual joystick appears as a HID device in WIN+R > joy.cpl… which i am controlling with a mouse! EPIC SWAG MLG 420 STYLE!!!1

YOU NEED 2 THINGS:

MouseSteering (Github) - the interface

+

ViGEmBus (Github) - the driver

it turns your mouse into a joystick, i.e. the relative position of your cursor from the centre of the screen, which makes it easy to bind each quarter (or half) of the screen +X/-X and +Y/-Y to anything in any game!

MORE ABOUT MouseSteering (CLICK)
  • MouseSteering comes in a .zip portable archive (no installation)
  • MouseSteering does NOT require vJoy installed!
  • MouseSteering is NOT to be confused with MouseSteering_V1.7.2 (Steam Discussions)
  • MouseSteering supports X/Y/Z axes, i.e. XInput analogue buttons 6/7
  • MouseSteering has a customizable text (.toml) config
  • MouseSteering can toggle any axis on demand (boundable keys)

TIP1: set snap_input = false in config.toml for unfiltered linear movement
TIP2: set edge_scaling = true under [throttle_config] for more sensitive pedals (technically edge_scaling option is the deadzone)

MORE ABOUT ViGEmBus (CLICK)
  • ViGEmBus is a digitally signed kernel-mode 32/64 bit open source device (bus) driver
  • ViGEmBus can be uninstalled via WIN+R > appwiz.cpl
  • ViGEmBus is deprecated (archived), but still works on Win7 up to Win11! ^_^
  • ViGEmBus is a fork of vXbox, also known as ScpVBus
  • ViGEmBus’s virtual joystick device (XBOX 360 Controller) shows up ONLY when in use by a feeder, e.g. MouseSteering. emulation of other controllers is dependant on the feeder (which device is it coded to emulate)
  • unlike vJoy, ViGEmBus does NOT have an interface

NOTE: for more information, visit this official page


THE OLD METHOD (using vJoy):

LEGACY vJoy INSTRUCTIONS (CLICK)

YOU NEED 2 THINGS:

Virtual Controller (SourceForge) - the interface

+

vJoy v2.1.9.1 (Github / SourceForge) - the driver

it translates (feeds) configurable inputs (position, buttons) of your mouse to vJoy, emulating a joystick, which makes it easy to bind each quarter (or half) of the screen +X/-X and +Y/-Y to anything in any game!


OTHER vJoy VERSIONS (CLICK)

PSA1: Virtual Controller (interface) may NOT work on Win11!
PSA2: NEWER versions of vJoy did NOT work for me on Win10 (winutil) @ march 2025. GET v2.1.9.1 INSTEAD!!!

MORE ABOUT vJoy (CLICK)
  • vJoy is a digitally signed kernel-mode 32/64 bit open source device (bus) driver
  • vJoy can be uninstalled via WIN+R > appwiz.cpl or C:\Program Files\vJoy\unins000.exe
  • NOTE: on laptops, vJoy may disable itself to conserve battery. disable this via Device Manager > Human Interface Devices > vJoy Device > Energy Management
  • vJoy supports vXbox (Github), vKeyboard (Github) and vMouse (Github)!

MORE ABOUT Virtual Controller (CLICK)
  • do NOT close Virtual Controller during the game (minimise instead)
  • Virtual Controller can be uninstalled via WIN+R > appwiz.cpl or C:\Program Files\Virtual Controller\unins000.exe
  • NOTE: i have a “tutorial” for it a few lines down below!


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


ALTERNATIVE/OTHER MODERN/NEWER REMAPPERS/FEEDERS/VIRTUAL DEVICES:

including the penguins (tuxes)! <3
LIST OF VIRTUAL JOYSTICKS & INPUT REMAPPERS (CLICK)

MouseSteering_V1.7.2 (Steam Discussions)

NOTE: the original source code is from 2015, but there is a newer (2021) fork of it on Github

  • windows only (but AHK supports linux)!
  • a popular autohotkey (AHK) script for mouse steering that only has a horizontal X axis
  • uses RawInput (no interpolation/smoothing)
  • notably, has a mouse “force feedback” in the form of a “push back”, return-to-centre
  • has toggleable key binds for the input/steering telemetry (on-screen 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!

(hidden: author advertises ai slop)

x360ce (also on Github)


AntiMicroX (Github)

  • supports linux. x11 AND wayland
  • supports mouse and keyboard
  • TIP: unless remapping a PHYSICAL joystick, use a VIRTUAL one!

InputPlumber (Github)

  • linux only
  • uses evdev
  • rust btw

Xremap (Github)

  • linux only. x11 AND wayland
  • uses evdev AND uinput
  • supports mouse and keyboard

Input Remapper (Github)

  • linux only. x11 AND wayland
  • supports mouse and keyboard

QJoyPad (Github)

  • linux x11 only
  • supports mouse and keyboard
  • the oldest anarchy remapper (that still works)

UCR - Universal Control Remapper (Github) - C# version


UCR - Universal Control Remapper (Github) - AHK version

  • windows only
  • supports mouse
  • possible to change absolute AND relative input modes for mouse deltas!

Mouse2Joystick (Github)

  • windows only
  • requires ViGEmBus (Github)!
  • changes X/Y coordinates only on CONSTANT cursor movement (absolute input mode)
  • movement is limited by the boundaries of the monitor resolution!

mouse2joystick (Github)

  • linux only
  • bootstrapping script
  • steering is hardcoded to be used only with held mouse buttons

MTVJ - MouseToVJoy (itchio)

  • windows only
  • requires vJoy!
  • mouse steering works, but throttle and brake is bound to the mouse button (?)
  • has separate clutch & handbrake axes. shifting is bound to scroll wheel (?)

msfs_mouse_yoke (Github)

  • a windows only python script
  • uses X/Y/THROTTLE axes (bound to mouse wheel)
  • for flight simulators only (?)

KeyboardSplitterXbox (Github)

  • windows only
  • treats every connected HID keyboard as a separate device (otherwise windows will receive inputs all the same; common problem)

Joystick Gremlin (Github)


vJoySerialFeeder (Github)

  • windows only
  • requires vJoy!
  • for nerds only
  • uses uinput on linux

map2 (Github)

  • for linux nerds only
  • python config

FreePIE (Github)

  • for windblows nerds only
  • python config

NOTE1: you may also want a device driver to have something to remap - xpadneo (Github) or even Steam Input Configurator (archwiki)

NOTE2: as with any remapper/feeder, it is possible to remap a physically connected joystick/gamepad (even a steam deck)!


OLD vJoy + Virtual Controller TUTORIAL:

which i have made years ago (ancient ■■■■)…
VirtualController.exe TUTORIAL (CLICK)
  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:


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

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

  7. 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)

  8. 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)

  9. IO Devices > Setup > vJoy 1


    (completely straightforward, just turn it on)

  10. 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).

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

  12. 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.

  13. 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!!!

  14. 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!

  15. 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 you havent! also switch from windows! ^_^


FUN FACT: did you know that the playstation 2’s dualshock 2 & 3 controllers had 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! :3

P.S. unless you are an ai, feel free to share

<3