Powerwall

A powerwall is a large, ultra-high resolution display which displays stereoscopic 3D images. Coupled with a tracking system, it provides an immersive virtual reality experience.

Prerequisites

  • VRPN - Virtual-Reality Peripheral Network (VRPN) is a device-independent, network-based interface for accessing virtual reality peripherals in VR applications.

  • NDisplay Launcher - Ndisplay is an UE4 plugin which allows you to start your project on several PCs arranged in a cluster. It also supports a cluster made up of only one device.

    The NDisplay documentation can be found here.

    To run Skyreal in Powerwall mode, it must be started with the NDisplay Launcher, which can be found in the UE4 directory :

    C:\Program Files\Epic Games\UE_4.24\Engine\Binaries\DotNET\nDisplayLauncher.exe
  • Interaction Devices - To interact with Skyreal in Powerwall mode, interaction devices are needed. They must be trackable by the ART captors and have preset buttons execute actions in Skyreal (navigate, use commands …).

    We recommend you use the VenomX device, which has enough buttons and on which reflective balls can be added to make the device trackable.

Configuration

VRPN Configuration

In the VRPN config file vrpn.cfg, the used port needs to be defined (by default, it is 5000).

In VRPN, the VenomX device is managed as a keyboard. Hence, if a VenomX is used, a vrpn_Keyboard must be added too.

# start vrpn test for DTrack
vrpn_Tracker_DTrack DTrack  5000
vrpn_Keyboard Keyboard

The StartServer.bat (located in the VRPN directory) launches the VRPN server.

The StartTest.bat (located in the VRPN directory) allows you to see which data is being received by the server.

NDisplay Configuration File

The configPowerwall.cfg contains the configuration options for the VR space and devices in NDisplay.

Not all settings must be redefined for a standard use of Skyreal. For a more precise description of these settings and their effects, please refer to the NDisplay documentation.

Cluster Node

The IP address of the cluster_node must be redefined. Use the address of the PC you will be running the simulation on.

[cluster_node] id=node_1 addr=127.0.0.1 port_cs=41001 port_ss=41002 port_ce=41003 master=true sound=true window=wnd_node_1

Window

Each window configuration defines a set of properties for the main window of an instance of your Unreal Engine application.

[window] id=wnd_node_1 viewports=vp_node_1 fullscreen=true

It might happen that the fullscreen mode doesn't work. In this case the parameters ResX and ResY become mandatory.

[window] id=wnd_node_1 viewports=vp_node_1 fullscreen=false ResX=1920 ResY=1080

A window can contain multiple viewports: viewports="vp_node_1,vp_node_2".

Viewport

Each window configuration described above refers to one or more viewport configurations, each of which defines a rectangular area of the game window that nDisplay should fill with a rendered view of the scene.

[viewport] id=vp_node_1 x=0 y=0 width=1920 height=1080 flip_h=False flip_v=False projection="proj_screen_1"

Projection

It defines the projection type and the screen to render. It doesn't require any modifications.

[projection] id="proj_screen_1" type="simple" screen="screen_1"

Screen

You must define the size of the screen. Leave location and rotation to zero, it is placed by the display_1 scene node.

[screen] id=screen_1 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3.33,Y=2.5" parent=display_1

Camera

The standard line doesn't require any modifications.

[camera] id=camera_static loc="X=0,Y=0,Z=0" parent=EyesCenter eye_swap="false" eye_dist="0.064" force_offset="0"

Input

To connect the powerwall input device to SkyReal, connect all of the devices to VRPN and use the [input] tag.

In the example bellow, three kinds of input devices have been connected: Analog, Buttons and Tracker.

[input] id=SkrMouse type=analog addr=Mouse0@127.0.0.1
[input] id=SkrKeyboard type=buttons addr=Keyboard0@127.0.0.1
[input] id=SkrTrackers type=tracker addr=DTrack@127.0.0.1 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front=Y right=X up=Z parent=cave_origin

The tracker device should be connected to a parent node (see below), which acts as a tracking origin.

Scene_node

You need to redefine the coordinates of the nodes, including:

  • The Z component of cave_origin. In this example, Z=-0.043 because the room calibration tool used was 0.043 m high.
  • All the components of display_1 (center of the screen) : X is the distance between the screen and the origin, Z is the distance between the floor and the center of the screen
[scene_node] id=cave_origin loc="X=0,Y=0,Z=-0.043" rot="P=0,Y=0,R=0"
[scene_node] id=display_1 loc="X=2.435,Y=0.12,Z=1.485" rot="P=0,Y=0,R=0" parent=cave_origin

In order to remap the input trackers to the eyes, controllers and body parts, add the following nodes:

[scene_node] id=EyesCenter loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=0
[scene_node] id=RightHandController loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=1
[scene_node] id=LeftHandController loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=2

[scene_node] id=HeadTracker loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=3

[scene_node] id=Hips loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=4
[scene_node] id=Pelvis loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=5

[scene_node] id=RightShoulder loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=6
[scene_node] id=LeftShoulder loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=7
[scene_node] id=RightUpperArm loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=8
[scene_node] id=LeftUpperArm loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=9
[scene_node] id=RightElbow loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=10
[scene_node] id=LeftElbow loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=11
[scene_node] id=RightLowerArm loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=12
[scene_node] id=LeftLowerArm loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=13
[scene_node] id=RightWrist loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=14
[scene_node] id=LeftWrist loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=15
[scene_node] id=RightHand loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=16
[scene_node] id=LeftHand loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=17

[scene_node] id=RightUpperLeg loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=18
[scene_node] id=LeftUpperLeg loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=19
[scene_node] id=RightKnee loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=20
[scene_node] id=LeftKnee loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=21
[scene_node] id=RightLowerLeg loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=22
[scene_node] id=LeftLowerLeg loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=23
[scene_node] id=RightAnkle loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=24
[scene_node] id=LeftAnkle loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=25
[scene_node] id=RightFoot loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=26
[scene_node] id=LeftFoot loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=27

[scene_node] id=OtherTracker0 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=28
[scene_node] id=OtherTracker1 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=29
[scene_node] id=OtherTracker2 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=30
[scene_node] id=OtherTracker3 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=31
[scene_node] id=OtherTracker4 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=32
[scene_node] id=OtherTracker5 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=33
[scene_node] id=OtherTracker6 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=34
[scene_node] id=OtherTracker7 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=35
[scene_node] id=OtherTracker8 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=36
[scene_node] id=OtherTracker9 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" tracker_id=SkrTrackers tracker_ch=37

User inputs

To remap all inputs coming from VRPN to the SkyReal inputs, use the [input_setup] tag. This tag will link all of the inputs to Unreal events. In the example below, the channel 28 coming from the input SkrKeyboard declared before, is connected to the SkyReal input nDisplay Button 0. Because of an issue with nDisplay configuration, you must write "nDisplay Button 1" to bind the input "nDisplayButton1"

[input_setup] id=SkrKeyboard ch=28 bind="nDisplay Button 0"
[input_setup] id=SkrKeyboard ch=29 bind="nDisplay Button 2"

[input_setup] id=SkrKeyboard ch=15 bind="nDisplay Button 1"
[input_setup] id=SkrKeyboard ch=42 bind="nDisplay Button 3"

[input_setup] id=SkrKeyboard ch=78 bind="nDisplay Button 4"
[input_setup] id=SkrKeyboard ch=74 bind="nDisplay Button 5"

[input_setup] id=SkrKeyboard ch=72 bind="nDisplay Button 6"
[input_setup] id=SkrKeyboard ch=80 bind="nDisplay Button 8"
[input_setup] id=SkrKeyboard ch=75 bind="nDisplay Button 10"
[input_setup] id=SkrKeyboard ch=77 bind="nDisplay Button 12"
[input_setup] id=SkrKeyboard ch=17 bind="nDisplay Button 7"
[input_setup] id=SkrKeyboard ch=31 bind="nDisplay Button 9"
[input_setup] id=SkrKeyboard ch=30 bind="nDisplay Button 11"
[input_setup] id=SkrKeyboard ch=32 bind="nDisplay Button 13"

#[input_setup] id=SkrMouse ch=0 bind="nDisplay Analog 0"
#[input_setup] id=SkrMouse ch=1 bind="nDisplay Analog 2"

By default, these inputs are declared in the SkyReal/SkyReal/Config/DefaultInput.ini file.

Stereo

The standard line doesn't require any modifications.

[stereo] eye_swap=False

General

The standard line doesn't require any modifications.

[general] swap_sync_policy=0

NDisplay Launcher

Start the NDisplay Launcher.

In Applications, add and select the SkyReal executable (1). In Config Files, add and select the config file (2).

all_v1.11_skyreal_NDisplay_config

Sky Real supports command line arguments for the powerwall, allowing for an easier configuration of the base parameters. Click here for more information.

VenomX

Input Configuration

VenomX inputs can be mapped using a dedicated software, which can be downloaded here.

To reassign inputs, go to the PC tab, click on the button you wish to remap and hit the new key you wish to assign to that button.

When 2 VenomX's are used, one of them must be disconnected before you can configure the other.

Starting SkyReal

Your setup should now be complete. To start using SkyReal with your powerwall, follow the following steps:

  • Stars the Dtrack record
  • Start the VRPN server
  • Start the NDisplay launcher
  • Start the listeners executable
  • Click on the Run button

Skyreal should now start on your powerwall, and your trackers should be tracked.

Troubleshooting

  • Unreal Engine is not compatible anymore with OpenGL. You must use a render mode compatible with DirectX.
  • In the Window configuration, fullscreen=true can produce an error. You must set the parameter to false and set the window size with ResX and ResY.

If you are having other issues with your powerwall configuration, please contact the SkyReal support team.