[BeamNG + RBR] KB+M & full mouse XYZ control - steering, throttle & brake!

please move this to FAQ if you found this useful!
this will greatly improve this page’s searchability on the internet.

for other games (using vJoy / vXbox / ViGEmBus + feeder + remapping XYZ axis), -
scroll down and read the comment section!
tl;dr included!

SLOW INTERNET WARNING: THERE ARE PICTURES!


hello everyone. :blush: i have been asked numerous times by many people “how do you even hold a drift with a mouse?!” - in this tutorial, i will be sharing my secrets! this may not differ that much from other guides for beamNG (and RBR!) on the internet, but nevertheless, i couldnt find one on beamMP (and rbr…). besides, it’s a pretty niche and a hard-to-master method of driving! coming from communities such as richard burns rally and trackmania, mouse control is a pretty cheap alternative to sim rigs for any racing game! fortunately, beamNG allows you to bind axis controls to a mouse in-game without third-party software. soooo, if you ever wanted to drive better or are waiting for your new wheel - embrace the simulator genre and ditch that controller! lets dive in…





:mouse: :mouse2: :computer_mouse: FULL MOUSE CONTROL: :mouse: :mouse2: :computer_mouse:

(not recommended for beginners)
(FOR KB+M SCROLL DOWN)

this is the setup that i use. you’ll probably find kb+m easier. see down below.

  • you will need: a mouse with low DPI (sensitivity), preferrably without a trackball, with side buttons (mouse3, mouse4, mouse5, mouse6), vertical mice are welcome and encouraged (they do not reduce carpal tunnel syndrome, but are ergonomic and more comfy imho)

usually, when it comes to driving by means of a mouse, people refer to keyboard AND mouse controls, however, i drive by only using A mouse (singular).

  • trivia: disable all and any driving assists:
    – if you are struggling with shifting, enable clutch assist
    – if you are driving regular cars, dont drift or rally, enable throttle assist
    vehicle behaviour should be all off
    (because otherwise you will rev the engine while in the menu)


(res small cos im on steam deck :P)

  • (!) the problem: clutch is the THIRD pedal, and since we are limited only to TWO analogue axis, clutch will be inevitably bound to the digital, binary key input (value of 0 OR 1), therefore we can only clutch kick just to shift a gear, which is pretty harmful to the transmission and the engine. however, if we’re drifting, there are such other techniques much easier on your car, for example, weight transfering and the use of the handbrake. anyway, such rapid clutch depressions can be mitigated by the built-in filtering logic which smoothes such binary key presses in beamNG (by default these are A and D for keyboard users) that i will talk about later, though it wont be enough. anyway, all of this is not a problem if we are driving a DCT/auto or if we are clutch kicking in a professional racing automobile in a videogame, however…

– (if that bothers you, skip to the second part of the tutorial that includes the keyboard in the setup. it’s much more casual.)

after that, in the controls > vehicle, unbind (unassign) keyboard keys that you were using to control the car with, for example: “throttle”, “brake” - unbound (because we’re using combined throttle&brake instead), then “steering (left key)” and “steering (right key)” - unbound (because we’re using steering (axis/mouse). this is because such keys will interfere with mouse controls and will prioritise them in the middle of driving if you accidentally press them.


(do not worry, at the bottom of the list there are reset buttons)

btw the right mouse button (MOUSE2) is unboundable, because it is “hardcoded to camera rotation”, as the devs replied, and cannot be changed, so, that sucks…

  • COMBINED THROTTLE&BRAKE:
    – bind to VERTICAL MOUSE AXIS (Y AXIS) - just move it up and down
    filter: automatic (automatically sets to wheel (direct) since it is an analogue axis)
    inverted axis: enabled (unless you like natural scrolling or prefer brakes to be applied by moving the mouse upwards)
    linearity: 1
    deadzone (rest): 0
    deadzone (end): 0,5 (this is the distance your hand should travel to go full throttle or full brakes - lower for more precision, higher for faster response. experiment!)

  • STEERING (AXIS/MOUSE):
    – bind to HORISONTAL MOUSE AXIS (X AXIS) - just move it left and right
    filter: automatic
    inverted axis: off
    linearity: 1
    deadzone (rest): 0
    deadzone (end): 0
    force feedback configuration: oh so you have a wheel now, huh?

but wait! theres more…

  • CLUTCH
    – bind to LEFT MOUSE BUTTON
    filter: key (smooth) - (do you remember why we’re doing this?)

  • PARKING BRAKE
    – bind to MOUSE SCROLL WHEEL (not to be confused with MOUSE3 or BUTTON3)
    – this is supposed to be the FOURTH axis, however, we’ll be smashing it regardless whether it can be pulled slightly or not. and as a matter of fact, not even wheel owners have such luxury of having a dedicated parking brake, therefore this stays unfiltered.

  • SHIFT UP
    – bind to BUTTON3 (side button)

  • SHIFT DOWN
    – bind to BUTTON4 (side button)

  • (optional) TOGGLE IGNITION STATE
    – bind to BUTTON5 (side button)
    (may not work if you are on linux)

  • (optional) SOME OTHER BUTTON
    – bound to BUTTON6 (side button)
    (may not work if you are on linux)

in controls > camera:

  • CENTRE CAMERA
    – bind to MOUSE SCROLL WHEEL (same as handbrake)
    (because you may accidentally press right click and move your camera)

when you are done…

now, think of your screen as a mathematical graph of a function. your centre of the screen, 0(X) 0(Y), is where you apply no throttle, no brakes and no steering input. gently move your mouse (cursor) upwards to depress the gas pedal. then, slowly, very slowly move your mouse downwards to apply brakes. later you will realise how important it is not to go “full ABS mode”, also known as “to lock up”, if you dont have ABS. when you will understand the basics, then you can try taking corners at different speeds. remember, it does matter whether you release or depress it. unfortunately, and i only say this now but you probably saw it coming - no, you cannot trail brake, as there is no way to simultaneously brake and apply throttle. (EDIT: it IS possible, but it involves third-party software. it requires to invert either the Y or Z axis, so that brakes are applied to the remaining percent of the throttle not being depressed, e.g. throttle 75% > brakes 25%. however, this bind should be an on & off toggle, otherwise it will be impossible to drive normally. to learn more, scroll down to the comment section). however, let it not disappoint you as it doesnt make you any less competitive! wheel players applaud my skills, so can you!

you can see the exact inputs you are doing in UI Apps > Pedals and Axis

and that’s about it! happy trailing, drifting, rallying, baja-ing, racing, cruising, etc! <3





:mouse: :mouse2: :computer_mouse: MOUSE + KEYBOARD CONTROL: :keyboard: :musical_keyboard:

(recommended for beginners)

this is the second part of the tutorial that you probably skipped to because it is just borderline insane to shift gears by using only a mouse. nonetheless, welcome, new mouse driver! this is a much simpler way to drive a vehicle in beamNG without worrying about shifting. this is generally the FASTER way to learn any automobile sport, including drifting!

  • you will need: a mouse with low DPI (sensitivity), preferrably without a trackball, with side buttons (mouse3, mouse4, mouse5, mouse6), vertical mice are welcome and encouraged (they do not reduce carpal tunnel syndrome, but are ergonomic and more comfy imho)

disable the same assists as in the full mouse tutorial above, except we do simplify it a bit - we are enabling the game shifting logic (albeit not perfect and unrealistic) to ease our keyboard struggles:

after that, in the controls > vehicle, unbind (unassign) keyboard keys that you were using to control the car with, for example: “throttle”, “brake” - unbound (because we’re using combined throttle&brake instead), then “steering (left key)” and “steering (right key)” - unbound (because we’re using steering (axis/mouse). this is because such keys will interfere with mouse controls and will prioritise them in the middle of driving if you accidentally press them.


(do not worry, at the bottom of the list there are reset buttons)

TWO IMPORTANT BINDINGS:

  • combined throttle&brake - same settings as above in full mouse control section…
  • steering (axis/mouse) - same settings as above in full mouse control section…
    (sorry, but you had to pay attention!)

but wait! theres more…

  • CLUTCH
    – bind to LSHIFT
    filter: key (smooth) - (as mentioned earlier, this is supposed to be our third axis that we cant have on a mouse, therefore we are trying to smooth its transition between 0 and 1 value states)
    (since the assists are doing the shifting job for us here, we use the clutch for the clutch kick technique to intentionally lose the grip)

  • PARKING BRAKE
    – bind to SPACEBAR
    – once again, the forgotten FOURTH axis. filtering can be omitted…

  • SHIFT UP
    – bind to X
    (can be any key, this is just for better posture and less wrist fatigue)

  • SHIFT DOWN
    – bind to Z
    (can be any key, this is just for better posture and less wrist fatigue)

next are the keys you would have sacrificed if you were in full mouse control

  • FLASH HIGH BEAM HEADLIGHTS
    – bind to LEFT MOUSE BUTTON
    (this is MAINLY to indicate you wish to overtake in a race)

in controls > camera:

  • CENTRE CAMERA
    – bind to MOUSE SCROLL WHEEL or BUTTON3 (side button)
    (in case you accidentally move your camera with the UNBOUNDABLE right click)

  • LOOK BACK
    – bind to **MOUSE SCROLL WHEEL or BUTTON3 (side button)
    (in case you cant see who is in the mirror)

(optional) in controls > beamMP (at the bottom of the list):

  • (optional) PLAYER NAMETAGS
    – bind to BUTTON4 (side button)
    (sometimes they’re distracting)

  • (optional) TOGGLE CHAT
    – bind to BUTTON3 (side button)
    (if you are using the new imgui experimental beamMP chat, otherwise you can hide the interface with ALT+U)

when you are done…

now, think of your screen as a mathematical graph of a function. your centre of the screen, 0(X) 0(Y), is where you apply no throttle, no brakes and no steering input. gently move your mouse (cursor) upwards to depress the gas pedal. then, slowly, very slowly move your mouse downwards to apply brakes. later you will realise how important it is not to go “full ABS mode”, also known as “to lock up”, if you dont have ABS. when you will understand the basics, then you can try taking corners at different speeds. remember, it does matter whether you release or depress it. unfortunately, and i only say this now but you probably saw it coming - no, you cannot trail brake, as there is no way to simultaneously brake and apply throttle. (EDIT: it IS possible, but it involves third-party software. it requires to invert either the Y or Z axis, so that brakes are applied to the remaining percent of the throttle not being depressed, e.g. throttle 75% > brakes 25%. however, this bind should be an on & off toggle, otherwise it will be impossible to drive normally. to learn more, scroll down to the comment section). however, let it not disappoint you as it doesnt make you any less competitive! wheel players applaud my skills, so can you!

you can see the exact inputs you are doing in UI Apps > Pedals and Axis

and that’s about it! happy trailing, drifting, rallying, baja-ing, racing, cruising, etc! <3

please ask any questions - i will help you!

bye!

if you want to see this in action or want to learn drifting, let me know!

<3

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

SLOW INTERNET WARNING: THERE ARE PICTURES!

tl;dr skip to “HONORABLE MENTION” section and get those two (2) things.

hello everyone. this comment is an addendum for keyboard and mouse AND / OR full mouse controls for OTHER sim racing games, e.g. richard burns rally (RBR), DiRT Rally, EA SPORTS WRC, Assetto Corsa (AC), iRacing, Forza Horizon, Gran Turismo, Project CARS, Automobilista, Farming Simulator, EA SPORTS F1, Bus Driver Simulator, SnowRunner, MudRunner, Wreckfest, MS Flight Simulator (or VATSIM), Euro Truck Simulator (although it already has a built-in mouse control) or even something else!

due to there being absolutely ZERO, NADA, NIL guides, tutorials or instructions on the internet (cos they all are utter ■■■■■■■■ and misleading, especially youtube ones) on how to set up a proper, full mouse and / or keyboard AND mouse controls in RBR - where -X/+X left & right is mouse steering; -Y/+Y & -Z/+Z are mouse throttle and brake (50%/50%) controlled by the vertical Y axis, without any additional button pressed or held, - i have decided to create my own guide for future reference and crazy people alike who want to control a vehicle in a videogame with a mouse. my guide could be an absolute slop, but hey, i tried my best. this post will be updated for a short while. remember, windows SUCKS and it is impossible to avoid this mess. extreme yapping below!


trivia (optional):

  • feeders are applications or software that “feed” or send data (e.g. cursor position value change or keyboard input) from a serial port, i.e. your HID device, e.g. a mouse or a keyboard, to vJoy, vXbox (aka ScpVBus) or ViGEmBus (links to them all below) - also HID devices, or technically “emulators” of certain devices (notably joysticks and yokes), which by themselves are also device drivers (also known as a bus driver - sorry, i meant “bus driver”). this essentially makes the feeder a “translator”. almost every feeder comes with a graphical interface (GUI) where you are able to bind or assign a key (digital, 0 or 1) or axis input (analogue, 0 to 100) to “feed” or send (translate) that input data to the virtual joystick emulator or other HID compliant device, which they then can interpret inputs as keys (digital, 0 or 1) or XYZ axis (analogue, 0 to 100) - however and anyhow you like them to be remapped, bound or assigned. for example, people are using vJoy in MS Flight Simulators, and one of the aircraft controls is the trim-tab control, which is an analogue axis, however, by translating a continuous key holding input to vJoy (a keyboard is an absolute input device, btw, more on that below), it can interpret a digital (0 to 1) input as a linear (0 to 100) analogue axis input - it is literally magic, is it not? moreover, vJoy is not necessarily a “joystick”, it can also be interpreted as various axis BEYOND just XYZ axis, e.g. a steering wheel or a pedal (that by themselves are able to have remappable digital key inputs! think a steering wheel that is able to press A and / or B buttons, etc.!), which is what you wish to accomplish with a mouse - though, not to be confused with actual HID wheel and pedal axis - they are remappable, but may not work with a mouse, so instead we are using the actual joystick X, Y and Z axis (excluding Rx, Ry, Rz, the handbrake and the clutch axis!). newer versions even have support for MIDI! so, there are a few ways to feed input data to a virtual generic joystick - via a proxy DLL, DLL injectors or via an API hook (low level and high level). there are a few input API’s a feeder can choose from - GameInput (newest, a static link), XInput (new, not to be confused with xinput in linux!) and DirectInput (legacy). then, there is RawInput (NOT an API, but literal raw input data, always relative input, skips system settings, has no interpolation or smoothing). for my linux guys, we are using libinput (new) and sometimes evdev and joydev API (old, can be a feeder, this is what Steam Virtual Controller uses btw). last but not least, there are relative and absolute analogue inputs. a joystick can be both relative and absolute, where relative axis input is “keep constant velocity” RELATIVE to the centre of the screen or its neutral position (X0, Y0), whereas the absolute axis input is “release to neutral position when no input received”, in other words, relative is an “endless slider” (maximum value range of which you can limit) and absolute is the “camera control” (whatever input value of which always returns to the neutral position (centre), but NOT the camera itself!). the keyboard is always an absolute input device. can you guess why? correct, otherwise i would not be able to write this guide or else every key will get stuck in infinite input. now, relative and absolute input of a MOUSE is a whole different story. a mouse is by default always a relative input device, but it too can be an absolute input device. the system interprets mouse position so that it is visible on the screen (so that it doesnt disappear forever out of bounds), however, the mouse itself does not care about any boundaries. were you to move the mouse in a direction - it will keep increasing (or decreasing) its input value infinitely and forever, this is especially true if you are remapping it to a joystick, which is what we are literally doing. BUT! this is where it gets interesting. if the joystick has a value range, the mouse does not. it will exceed / overflow its emulated joystick position, and while the joystick shows a maximum input value range of 0 to16384, mouse itself can be in the millions. this may be a slight problem, but fortunately feeders allow to tweak and change many things if things go wrong. but what about the ABSOLUTE input of a mouse? it is actually in every (3D) videogame, because a videogame is NOT an extension of your system. simple as that - CAMERA control in videogames is an absolute input, so unless it moves constantly - it is relative (relative to the centre or its neutral position). but that is about it, really, when it comes to absolute input (of a mouse) in videogames, is it not? please do tell me if you know of a game where the absolute input of a MOUSE (not joystick!) is used BESIDES camera control - that would be fun. now that i think about it, there is a certain videogame that requires you to control an airplane / helicopter with a mouse with absolute controls… ANYWAY, finally, there can only be ONE (1) active feeder. there can ALSO be only ONE (1) active axis of the same axis - which may sound obvious, but is actually a limitation, and you are unable to bind multiple inputs to the same axis, e.g. Y to Y and Z to Y - although the other way around works! BUT! enabling another vJoy device (in vJoyConf), you can have twice or more the amount of the same axis (useful for on / off flight controls!). feeders should STAY ACTIVE (can be minimised) during the game. for vJoy or ViGEmBus alternatives for linux - scroll down to the bottom. sorry for caps lock, btw, it is because some people have a short attention span (like me). so, in short, a feeder connects to a device driver which can interpret or emulate input from any other HID device. this way you can, for instance, control a joystick by mouse, which is, in retrospect, perhaps only useful for some very obscure situations, like when you want joystick control but absolutely HATE using them (so much so that you destroyed it), so yes, you are indeed weird for wanting this in the first place (couldnt be me). i hope that up there made sense.

THE OLD AND SLOW METHOD - manual mapping, slower -
consider other options too!

  • vJoy v2.1.9.1 (Github / SourceForge) - THE DEVICE DRIVER
    installs as an HID device. easy to uninstall btw (in Win+R > appwiz.cpl).
    vJoy is a digitally signed 64 bit driver.
    NOTE: on mobile devices, e.g. laptops, vJoy can disable
    itself to conserve battery. this feature can be turned off in
    Device Manager > Human Interface Devices > vJoy Device > Energy Management
    NEWER versions DID NOT work for me - winutil Win10, march 2025,
    but they still potentially MAY WORK for your system.
    alternatives to vJoy are vXbox (Github) and ViGEmBus (Github).

vJoy v2.1.8 (Github) - works (win7)
vJoy v2.1.9.1 (Github) - works (win10, win11) - use this one
vJoy v2.2.1.1 (Github) - does not work (10, 11)
vJoy v.2.2.2.0 (Github) - does not work (10, 11)

  • Virtual Controller (SourceForge) - THE FEEDER
    it translates (feeds) editable inputs of HID devices, e.g. a mouse, to vJoy.
    do not close the feeder during the game (can be minimised).
    alternatives are provided down below. check them out!

HONORABLE MENTION (the ViGEmBus way without vJoy) - tl;dr? GET THIS!
THE NEW AND FAST METHOD.


  • MouseSteering (Github) - photo above
    REQUIRES ViGEmBus (Github) - otherwise does not launch.
    easy to uninstall btw in Win+R > appwiz.cpl
    ViGEmBus’s XBOX 360 controller shows up ONLY when in use (by a feeder).
    (AFAIK emulation of DualShock 4 controller is dependant on the feeder)
    ViGEmBus is a digitally signed 64 bit device driver.
    kernel-mode driver (!). supports 32 and 64 bit.
    works for Win7 up to Win11. deprecated, but still works!
    (NOT to be confused with MouseSteering_V1.7.2 (Steam Discussions)
    DOES NOT require vJoy installed. feel free to uninstall vJoy.
    easier and faster to use than MouseSteering_V1.7.2.
    1:1 replica of linear mouse controls from beamNG. good enough for anything!
    ■■■■ all other instructions, just use this. has X, Y and Z axis.
    also has key bindings to disable any axis on demand.
    it just worked for me and that is all i really need.
    comes in .zip archive (no installation). has a .toml text config.
    however, there are little to no settings that can be changed.
    set snap_input = false in config.toml for unfiltered linear movement.
    set edge_scaling = true under [throttle_config] for more sensitive pedals
    (technically edge_scaling option is a deadzone, but i digress)
    when using this, you do not have to read my guide any more then.

ALTERNATIVE FEEDERS (if system is too old or new) - try them all!

  • x360ce - Xbox 360 Controller emulator (Website)
    mouse works! supports XInput, as well as other many API’s.
    very extensive settings, in fact, THE MOST customisable feeder.
    works both with vJoy, vXbox and ViGEmBus.
    has 32 and 64 bit versions. digitally signed.

  • MouseSteering_V1.7.2 (Steam Discussions)
    a popular autohotkey (AHK) script for steering that only has X axis.
    uses RawInput API (no input interpolation or smoothing).
    if you need only the steering via X axis - GET THIS.
    has “push back” (a form of “force feedback” which pushes your cursor to middle,
    which can be easily simulated with other feeders via “release to neutral pos”,
    among other settings. has key binds and a visual driveline (steering telemetry).

  • UCR - Universal Control Remapper (Github) - C# version
    same functionality 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


    mouse works! surprisingly, setup is easier than what’s in my guide.
    has a lot of various input remaps for various devices.
    ability to change absolute and relative modes for mouse deltas.

  • Mouse2Joystick (Github)
    same as above. changes XY on constant cursor movement.
    movement is limited when screen boundaries are reached.
    boundable / remappable mouse buttons to joystick buttons.
    requires ViGEmBus (Github)
    DOES NOT require vJoy installed.

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

  • Joystick Gremlin (Github)
    same functionality as virtual controller (feeder).
    i have heard great things about it. however,
    mouse support NOT IMPLEMENTED. supports keyboard.

  • MouseToJoystick (Github)
    only changes XY value on CONSTANT (speed) movement.
    it is a mouse joystick in the most literal sense.
    double right click to activate / deactivate.

  • vJoySerialFeeder (Github)
    NOT TESTED. for advanced users. also supports linux.

  • FreePIE (Github)
    if you know python and how to code - look no more.
    supports practically anything, including phone and MIDI.
    there are user-submitted scripts for mouse-to-joystick control.
    but sim racers are not coders, so we are ignoring FreePIE.


MISCELLANEOUS MOUSE CONTROL SOFTWARE:

  • msfs_mouse_yoke (Github)
    standalone python script. does not use any virtual joystick device drivers.
    uses a virtual controller python library - vGamepad (Github) - device driver
    as well as a python input feeder - pynput (Github) - feeder
    uses X, Y and THROTTLE (bound to mouse wheel) axis.


my RBR mouse steering + throttle and brake (vJoy XYZ axis) tutorial:

NOTE: OUTDATED METHOD (not really “outdated” per se, it is so that YOU dont go through literal hell by manually assigning axis remap, when there is already a working out-of-the-box solution above). in this guide, we are manually binding / remapping mouse input in the “virtual controller” feeder to joystick input of a virtual generic joystick (vJoy). so, if you are going for the vJoy way (slow) - continue with this guide, otherwise, scroll back up to “HONORABLE MENTION” section (NEW METHOD, fast). cluttered mess without formatting below. wItHoUt fUrThEr aDo, LeTs jUmP rIgHt InTo iT :crazy_face: :crazy_face:

  1. install vJoy
    (you may need to restart, but i didnt)

  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, more on that below) 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 of a joystick, 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. to learn more, i talked about this in the trivia section above.
    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 (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
    it’s remapping / binding / assigning time.


    Modifier > “Set”
    (Modifier can also be “Increase” and “Decrease”, but you have to create another binding so that it does not increase infinitely! BASICALLY they are the same thing.)
    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)

    INPUT Name: Y
    OUTPUT Name: Y
    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 rudimentary. THIS Z AXIS CAN BE SKIPPED!
    INPUT Name: Y
    OUTPUT Name: Z
    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)
    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 / 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 vJoy device (in vJoyConf), 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 its axis! do this EVERY TIME your input values are offset / overflowing below 0% or over 100%, as shown on the example above.
    after calibration, it should be better, so try testing in-game.

  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)
    you could then additionally bind the shifter to your device of choice.
    in RBR, Throttle AND/OR Brake as separate axis DO NOT work. they will conflict and cancel out each other. instead we are using a built-in COMBINED axis, just like it’s “Combined Throttle&Brake” in beamNG. if for some reason throttle or brakes are overly sensitive than the other, then you are in the same boat as me - i dont know why that happens either, sorry… no, its not because of value ranges or anything, it happens even with just the Y axis, so… and no, filters dont help either, its as if this specific combined binding in-game isnt affected by filtering! i call game issue.
    however, if there are no such binding in your game, then you will have to come up with your own bindings for 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. this was honestly a nightmare to figure out myself, so i wish you the best of luck

  14. if nothing worked or you didnt like it > uninstall vJoy (C:\Program Files\vJoy\unins000.exe) and get a real wheel then? good luck !!!


it’s messy, rambly, cluttered, but it’s late as ■■■■ and i really gotta sleep.
i did it for yall mfs who are freaky like that with a mouse.

in fact, i GREATLY encourage you to try the other feeders.
otherwise you might miss out on something that actually works!

P.S. for my LINUX sisters and brothers, perhaps thou couldeth looketh upon:

  • uinput library, where you are able to create a virtual joystick, and evdev, joydev and mousedev - event devices, which are basically feeders. their usage, (un)fortunately, requires some intense reading. there are some premade templates available on the internet, as well as a few feeder scripts.
  • Steam Virtual Controller has a built-in virtual generic joystick and a feeder (also evdev), but is very limited. this is maybe only useful if you are on a Steam Deck, like i have been using throughout this whole page, which is a form of schizophrenia, perhaps, because i literally have a PHYSICAL and a virtual joystick IN THE FORM OF A COMPUTER…
  • mouse2joystick (Github) - just werks. however, you have to hold mouse buttons to use - henceforth it is suboptimal.

yeah. not many native stuffz. but you probably run stuff in QEMU anyway, right?

P.P.S. feel free to share, spread, edit and interpret this information anywhere and everywhere (blog about it yeah?). let people know! oh, but whatever will i do - someone has already made a guide on youtube! oh no!!! anyway. thank you.

<3