What are these controllers?
3Dconnexion creates six-degrees-of-freedom controllers for the CAD and graphics industry. They are widely used by engineers and designers because the controllers allow them to easily navigate 3D space in their favorite CAD programs. These are solidly built and very accurate. They are not a cheap joystick-like controller, that’s for sure. The accuracy and solid build makes these controllers excellent for gaming.
Are you affiliated with 3Dconnexion?
No. But we support their efforts to make their controllers more accessible to developers through their excellent SDK and support. We don’t sell controllers either. We just enjoy using them.
Do I require a 3Dconnexion controller to use ControlMyJoystick?
Which controllers are supported?
You can use any controller which is supported by 3Dconnexion’s 3DxWare10 software. Here is the list:
- SpaceMouse® Enterprise
- SpacePilot® Pro
- SpaceMouse® Pro Wireless
- SpaceMouse® Pro
- SpaceMouse® Wireless
- SpaceMouse® Compact
- SpaceNavigator® for Notebooks
You can optionally use a 3Dconnexion controller as a source of triggers and axis data. They have been selling these for years for use with CAD and other 3D design apps, and they are really nice to use for games – especially where six degrees of freedom is needed: up/down/right/left/forward/backward plus rotation around all axis. Let’s take a look at what is involved with getting these controllers to work with ControlMyJoystick and games. From here on it, we’ll refer to them as ‘controllers’.
You must install the 3DxWare driver software, which is available from the 3Dconnexion website. This software has some good practice apps so you can get to a feel of how to use the controller. It also has a Menu app that pops up when you press certain button on the controller. This Menu app can be used to configure the controller for use with an application. You tweak axis orientation and sensitivities and remap the buttons to perform different actions.
For each app you are running when you open the Menu, the Menu app will use an existing .xml from this folder:
or it doesn’t exist, a new .xml file will be created in:
If you go to a game and use the controller and it’s Menu app, it will create a new .xml file if it does not already exist. Take a look at the .xml file and you will see definitions for axis sensitivities, button mapping and more. You can manually edit the .xml file or use the Menu app to modify the settings in the file.
Getting it to work without ControlMyJoystick
3DxWare installs a 3DConnexion KMJ driver (Keyboard, Mouse, Joystick). This allows the controller to emulate a keyboard, mouse and joystick. You can see it working if you use the Chrome browser and find that you can scroll with the controller. It is reading the Chrome.xml and sending commands to Chrome. The main limitations for using it in-game are:
- No user-adjustable curve support or curve switching while in-game.
- Incomplete joystick emulation.
- No support for a proper deadzone or trim.
- No jitter reduction (from shaky hands).
- No way to launch macro’s with buttons.
- It really isn’t meant to be used in games this way. You can get close by hacking the .xml files, but it still doesn’t get you to a point where it feels like an effective controller.
Working with ControlMyJoystick
You still need to install the 3DxWare driver. And when you install ControlMyJoystick the installer will add a controlmyjoystick.xml to the following folder:
This controlmyjoystick.xml file holds critical configuration settings to allow it to be used as a joystick. ControlMyJoystick also allows you to:
- Specify a sensitivity (response) curve per axis. This is done via curve presets and a drag and drop curve node screen.
- Specify axis inversion, trim and deadzone.
- Set an overall jitter reduction for all games.
- Create axis curve groups so that you can have different response curves for different gaming phases, such as landing and combat. You can use a macro to switch between these axis curve groups while in-game.
The install also adds a Tetherscript Virtual Joystick driver. ControlMyJoystick will take controller axis data, apply curves to it, and then pass it through to the Tetherscript Virtual Joystick driver. Then game then needs to read the joystick axis and button data from this driver. This can be tricky because the game may be able to see both the KMJ driver as well as the Tetherscript Virtual Joystick driver.
You can either disable the KMJ driver (not a great solution, since you may want to use the controller for something else, like CAD), or you can use ControlMyJoystick’s special voice-activated axis binding commands or the non-voice binding commands in the Joystick menu. This will ensure that the game is listening to the Tetherscript Virtual Joystick instead of KMJ.
Enabling 3DxWare Support
In ControlMyJoystick, go to the Input menu, and select the 3DxWare item. This will bring up a configuration screen:
- Enabled – Check this box to allow ControlMyJoystick to communicate with the controller. This is what you will see in the log when you enable the controller.
- Show Axis Values – Check this box to show the real controller axis values in the 3DxWare sidebar panel.
- Smoothing – Check this box to reduce the jitter or shake that is caused by shaky hands. Since the controller ‘puck’ moves very small distances physically, any amount of shake can be magnified. Using smoothing introduces a bit of controller lag, with the higher Depth values causing more lag since it goes back and averages controller axis values to the specified Depth. So a depth of five will average the last five axis values. Default value is two. You can compare the raw axis input data with the smoothed data in the curve editing screen – it will show on the bottom response indicators. One will be jittery, the other will be less jittery.
- Tap Trigger – You can set the sensitivity and timing of tap recognition. Tapping is recognized on the controller puck Z axis only. You can use these taps as a trigger.
You’ll see the 3DxWare being initialized in the log tab as shown below:
Try moving the controller puck and you will see the axis indicators move in the 3DxWare sidebar panel. Take notice the vertical lines showing the axis positions. It’s going to look a bit different once we set a curve for an axis.
When you create a profile, a Default curve group will be created and all your curve edits will be in that group. You can rename the group, or create a new group by right-clicking in the curve group list. You can switch between groups by clicking on a curve group or by changing it with a script command. So, by using your voice or a controller button, you can change the active curve group and use different curves. This is very useful for different phases of a game, such as landing or combat. See tutorial 05 for more info.
Double-click on a curve, in this example, TX (Translation along the X axis) to bring up the curve editor. This will edit the TX curve. These curves are what really makes using the 3Dconnexion controllers in games a real treat. To adjust a curve, click and drag one of the control points which is located along the curve line. You can’t remove or add control points. The curve shown above is a preset available from the Curve Presents button. You can tweak this curve and you can reset it with the Reset Curve button.
Try moving the controller puck along the RX axis (move the puck from side to side or left to right). The un-curved axis data is represented by a small tick at the top of the axis indicators, and the curved data that will be sent to the virtual joystick driver is shown as a longer tick at the bottom. Try modifying a curve or invert it, and you will see how it works. You can also edit the curve while the game is running, so if, for example, an axis is too sensitive, you can bring up ControlMyJoystick and adjust the curve, then swap back to the game to test it out. No need to restart the game or ControlMyJoystick
- Prev – Click on this to go to the previous axis.
- Next – Click on this to go to the next axis.
- Enabled – Check this box to enable the axis. Sometimes you’ll want to disable an axis.
- Invert – Check this box to reverse the axis values. Some games allow axis inversion, and you can do it there if necessary, or here.
- Trim – You may have a controller that is miscalibrated and doesn’t seem to return to center when you take your hand off the controller. You can set a positive or negative trim value to ‘zero’ the axis value.
- Deadzone – You can set a value here so that any movement of the controller puck within the deadzone value of center will be considered as center. Most curves will have a deadzone of some kind since that without it, the controller is just too sensitive around the center position. Setting a deadzone this way is called an non-explicit deadzone. An explicit deadzone can be achieved by setting the deadzone to zero, and then by dragging the near-center curve nodes down to zero. Either way, it’s a deadzone and both techniques give the same results.
- Digital – Use this to enable Digital Joystick emulation, where you can send keystrokes to a game when you move the controller along the axis, or launch a macro when a joystick axis movement is detected. This allows you to map a key in-game to scroll whenever the axis goes positive or negative, and to stop scrolling when it returns to zero. You can do this for each axis. This is useful for games where you need to scroll a lot (like on a map, or overhead kind of game). Users often map the WASD keys for this, and you can do the same here.
- Digital Enabled – Enables digital joystick emulation for this curve.
- Digital Negative – This is sent to the keyboard driver. For example, ‘[A_DN]’ simulates pressing and holding the ‘A’ key on a real physical keyboard until the axis returns to zero, or goes positive. See tutorial 09 and 16 for more info.
- Digital Positive – This is sent to the keyboard driver. For example, ‘[D_DN]’ simulates pressing and holding the ‘D’ key on a real physical keyboard until the axis returns to zero, or goes negative. See tutorial 09 and 16 for more info.
- Digital Edit – This brings up the keystroke editor.
- Mirror – Check this box so that when you drag a curve controlpoint, the corresponding controlpoint on the other side of center will also move to the same value.
- << < > >> – Use these buttons to move the entire curve up or down.
- Reset Curve – Sets it to a flat curve where the curved data equals the raw data.
- Curve Presets – You can select a curve type here. The centered presets are for the normal axis, while the left and right curves or for a throttle/slider.
- Curve Presets Copy/Paste – If you go to a curve and select ‘Copy’, you can then go to another curve and select ‘Paste’ and it will overwrite the curve with the copied curve.