November 21, 2017

The Story Behind Moving with Your Feet in VR Mode

By Matthieu Vivant

The 3dRudder is a foot-powered VR motion controller that can be used while seated to navigate scenes in VR Mode with your feet, leaving your hands free to select, customize, or move objects. As we tested our plugin for UE4 in various VR projects, covering the three types of locomotion enabled by the 3dRudder (walk/run; hover over; fly) in both non-VR and VR games, we started using Unreal Engine‘s VR Mode. We immediately thought we could add value to this already amazing tool by providing an innovative way to navigate the scene by bringing our plugin to the editor. 770_3DRudder_Pic1.jpg Currently, the way to move around the scene in VR Mode is by pushing or pulling the environment with your hands, but why not use a method that allows you to move more naturally? Our objective in integrating the 3dRudder with VR Mode was to let developers:

  • Move intuitively around the scene, hover over it and easily adopt any observation point
  • Continue working at their desk instead of going to a specific VR set-up, easily switching between Editor and VR Mode
  • Not be limited by room scale
  • Only need the hand controller to select, customize, and move objects

Alongside the VR Mode integration, we also give developers the ability to move in the standard UE4 Editor with their feet, in addition to the keyboard/mouse or joystick (XInput).
3dRudder Integration with VR Mode

To integrate the 3dRudder with the VR Mode, we needed to add some specific code for handling VR Mode to our existing UE4 plugin . 
We followed the wiki for Creating an Editor Module to create a plugin for the Editor.

The first step was to create the 3dRudder Editor Module:

1. Add the editor module in the 3dRudder.uplugin:
 "Name": "_3DRudderEditor",
 "Type": "Editor",
 "LoadingPhase": "PostEngineInit",
 "WhitelistPlatforms": [ "Win64", "Win32" ]

2. Add the Unreal Editor (UnrealEd) as a dependency to the
PublicDependencyModuleNames.AddRange( new string[] {
    "CoreUObject",      // Provides Actors and Structs

3. Create F3DRudderEditorModule class inheriting from:

a. IModuleInterface, which lets us register, start, and stop the module.
b. FTickableEditorObject, which allows us to be ticked each frame, and get the input axes value of the 3dRudder and update the viewport camera.
void F3DRudderEditorModule::Tick(float DeltaTime)
    //UE_LOG(_3DRudderEditor, Warning, TEXT("tick %f"), DeltaTime);
    // 3dRudder SDK
    ns3dRudder::CSdk* pSdk = ns3dRudder::GetSDK();
    // Mode : curve
    ns3dRudder::ModeAxis mode = ns3dRudder::ValueWithCurveNonSymmetricalPitch;
    // Curves for each axis (Pitch, Roll, Yaw, UpDown)
    ns3dRudder::CurveArray *curves = new ns3dRudder::CurveArray;
    // Only one device (0)
    uint32 i = 0;
    if (pSdk->IsDeviceConnected(i))
        // Axis : X, Y, Z, rZ
        ns3dRudder::Axis axis;
        // Status of 3dRudder
        ns3dRudder::Status status;
        if (pSdk->GetAxis(i, mode, &axis, curves) == ns3dRudder::Success)
            status = pSdk->GetStatus(i);            
            if ((status == ns3dRudder::InUse || status == ns3dRudder::ExtendedMode) && GetDefault()->bActive)
                UpdateViewportCamera(FVector(axis.m_aY, axis.m_aX, axis.m_aZ), axis.m_rZ);

In the UpdateViewportCamera, we get the FEditorViewportClient object to call the MoveViewport function. We found this function in the source code of UE4 where it’s being used with the gamepad/joystick to move the camera in the editor.
void F3DRudderEditorModule::UpdateViewportCamera(const FVector& translation, float yaw)
    //UE_LOG(_3DRudderEditor, Warning, TEXT("tick %f"), yaw);
    if (translation.IsZero() && yaw == 0)
    if (GEditor != nullptr && GEditor->GetActiveViewport() != nullptr && GEditor->GetActiveViewport()->GetClient() != nullptr)
        FEditorViewportClient* client = StaticCast(GEditor->GetActiveViewport()->GetClient());      
        if (client != nullptr && !client->Viewport->IsPlayInEditorViewport())
            const FVector speed = GetDefault()->Translation;
            const float speedRotation = GetDefault()->RotationYaw;
            // X Y local
            FVector local(translation.X * speed.X, translation.Y * speed.Y, 0);
            FVector world = client->GetViewRotation().RotateVector(local);
            // Z world
            world += FVector(0.0f, 0.0f, translation.Z * speed.Z);
            // Pitch Yaw Roll
            FRotator rotation(0, yaw * speedRotation, 0);
            // Move Camera of Viewport with 3dRudder
            client->MoveViewportCamera(world, rotation);

4. We also created a U3DRudderSettings class to show and save in the Editor preferences some specific parameters :

a. boolean to activate/deactivate the camera motion
b. vector3 to change the velocity/speed of motion on X,Y,Z axes
c. float to change the velocity/speed of rotation on Z (yaw)
UCLASS(config = Editor, defaultconfig)
class U3DRudderSettings : public UObject
    U3DRudderSettings(const FObjectInitializer& ObjectInitializer);
    /** Enable/Disable */
    UPROPERTY(EditAnywhere, config, Category = Move)
        bool bActive;
    /** Speed Translation */
    UPROPERTY(EditAnywhere, config, Category = Speed)
        FVector Translation;
    /** Speed Rotation (Yaw) */
    UPROPERTY(EditAnywhere, config, Category = Speed, meta = (DisplayName = "Rotation (Yaw)" ))
        float RotationYaw;

To access those settings, you need to go to Edit -> Editor Preferences -> 3dRudder -> Viewport 
When you update those values, they get saved in Config/DefaultEditor.ini. This way you can have different motion speeds for each project.

We built the plugin on Visual Studio 2015 inside an empty project C++.
The full code is available on GitHub at:

The final step was to submit the package to the Marketplace team and make sure it worked smoothly with the latest versions of Unreal Engine (4.15, 4.16, 4.17 and soon 4.18). The 3dRudder plugin can be found here on the UE4 Marketplace.

Issues We Encountered
Overall, the integration went very smoothly. The only issue we encountered was moving the viewport camera, as we didn’t find the correct documentation or sample code. Instead, we looked at the VR Mode source code for how the camera was moved with a gamepad. 

Installing the Plugin
Finally, we created a video demonstrating how to install our plugin and what it feels like to use the 3dRudder with UE4.

It first shows how to install the 3dRudder plugin with the Editor and VR Mode, and then the use of the 3dRudder to move around the scene in the standard Editor at 0:45 and in VR Mode at 2:57.

Special Unreal Engine Offer

As we feel the 3dRudder really enhances the overall UE4 VR Editor experience, we are happy to give Unreal Engine developers a coupon that lets you buy the 3dRudder from the 3dRudder professional website for $99 or 99€ (instead of $179 or 179€), valid for the next 2 weeks. Use the code UE4SPECIAL3DRUDDER at