Version: v1.13

Cave

A CAVE is a large system, with ultra-high resolution displays (just one in case of a powerwall) 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.

    WIP Lien vers le notre hosté chez nous ?

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

    To get the NDisplay Launcher, you need to download Unreal Engine. Then it can be found in the UE4 directory:

    C:\Program Files\Epic Games\UE_[version]\Engine\Binaries\DotNET\nDisplayLauncher.exe

    The NDisplay documentation can be found here

    To run Skyreal in NDisplay mode, it must be started with the NDisplay Launcher. Only on PC of the cluster needs the NDisplay Launcher.

  • NDisplay Listener

    The NDisplay Listener will listen the requests send by the NDisplay Launcher and act accordingly.

    It can be found in the same directory as the Launcher:

    C:\Program Files\Epic Games\UE_[version]\Engine\Binaries\DotNET\nDisplayListener.exe

    It has to be copied and started on every PC of the cluster.

  • Visual C++ redistributable

    They can be found here

  • Interaction Devices - To interact with Skyreal in Cave 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 to use the VenomX or the Flystick. Both have enough buttons for Skyreal. The Flysick is more precise but more expensive and the VenomX need to be set up with some reflective balls to be trackable.

Configuration#

Directory organisation#

Launching an unreal application over a cluster of PCs with the NDisplay Launcher will in fact launch an instance of the same project on every PC. Hence, it is mandatory that the project and configuration file are located in the same directory on every PCs of the cluster. The paths must also contain no spaces. For the moment, using a shared network directory in which will be copied the files it is not supported by NDisplay.

Don't forget to maintain the same files on each PC when your do modifications.

NDisplay Default Project#

If this is the first time you are running a Unreal application on your device, we recommend you to first run the NDisplay Default Project provided by Unreal. This is the most efficient way to verify that the mandatory elements (3D space configuration, tracking etc) are well set up and working properly before running Skyreal.

You can either dowload this project here (WIP lien vers un paquet hosté par nous) to test it immediately, or you can generate it.

To do so, you need to download Unreal Engine on your PC and create the NDisplay Default Project: IMAGE CREATION WIP

The project need to be packaged to then be run properly, to so you will need to download Visual Studio. When it is downloaded and installed, follow these steps: IMAGE GENERATION DU PAQUET WIP

You can find more information in the Unreal documentation

When the package is downloaded or generated, copy it on every PC of your cluster.

NDisplay Configuration File#

The NDisplay Default Project contains template configuration files. We recomment to create your own config file from one of them. They can be foud here:

NDisplayDefaultProject\Content\ExampleConfigs

The configPowerwall.cfg contains the configuration options for the VR space and devices in NDisplay. Maybe abandonner ce file WIP

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 addresses of the PCs you will be running the simulation on.

[cluster_node] id="node_1" addr="192.168.1.1" window="wnd_left" master="true" sound="true"

Window#

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

[window] id="wnd_1" viewports="vp_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_1" viewports="vp_1" fullscreen="false" ResX=1920 ResY=1080

A window can contain multiple viewports: viewports="vp_1,vp_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. Adjust the resolution.

[viewport] id="vp_1" x="0" y="0" width="1920" height="1080" projection="proj_simple_1"

Projection#

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

[projection] id="proj_simple_1" type="simple" screen="scr_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. Adjust the size.

[screen] id="scr_1" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" size="X=3,Y=2" parent="display_1"

Camera#

Attach the standard camera to the head tracker in order to follow the head movement. Be careful to use the correct id and channel (it is the index of the tracker in the ART tracker list).

[camera] id="camera_static" loc="X=0,Y=0,Z=0" tracker_id=CaveTracking tracker_ch=0 eye_swap="false" eye_dist="0.064" force_offset="0"

Scene_node#

A scene node is a 3D point which represents the location and rotation of one of your 3D elements (origin, screens, tracker etc). The scene nodes corresponding to screens are placed in the center of them.

[scene_node] id="cave_origin" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"
[scene_node] id="cave_center" loc="X=0,Y=0,Z=1" rot="P=0,Y=0,R=0" parent="cave_origin"
[scene_node] id="display_front" loc="X=1.5,Y=0,Z=0" rot="P=0,Y=0,R=0" parent="cave_center"
[scene_node] id="display_floor" loc="X=0,Y=0,Z=-1" rot="P=-90,Y=0,R=0" parent="cave_center"
[scene_node] id="angle_left" loc="X=1.5,Y=-1.5,Z=0" rot="P=0,Y=-90,R=0" parent="cave_center"
[scene_node] id="display_left" loc="X=0,Y=-1.5,Z=0" rot="P=0,Y=0,R=0" parent="angle_left"

SkyReal needs its EyesCenter scene node and one HandController scene node to work properly:

[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

You can also add the following lines to remap input trackers to the other body parts:

[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

Input#

To connect the input devices 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.

Set the correct IP addresses, tracking origin and tracking axis. The axis orientatin in this example is the default orientation of the ART axis.

[input] id=MAxis type=analog addr=Mouse0@127.0.0.1
[input] id=MButtons type=buttons addr=Mouse0@127.0.0.1
[input] id=KButtons type=buttons addr=Keyboard0@127.0.0.1
[input] id=CaveTracking type=tracker addr=DTrack@127.0.0.1 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front=-Z right=X up=Y
[input] id=WandAxis type=analog addr=DTrack@127.0.0.1
[input] id=WandButton type=buttons addr=DTrack@127.0.0.1

Input Setup#

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. To know which is the channel corresponding to a key, use the VRPN StartTest.bat (see VRPN paragraph below).

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.

Here are the default connection between Buttons and Actions:

ActionName="IncreaseSpeed" Key=nDisplayButton4
ActionName="DecreaseSpeed" Key=nDisplayButton5
ActionName="VrMenuButtonLeftController" Key=nDisplayButton1
ActionName="VrMenuButtonRightController" Key=nDisplayButton0
ActionName="VrSecondaryButtonLeftController" Key=nDisplayButton5
ActionName="VrSecondaryButtonRightController" Key=nDisplayButton4
ActionName="ActionButtonLeftController" Key=nDisplayButton3
ActionName="ActionButtonRightController" Key=nDisplayButton2
AxisName="AxisLeftController_Y" Key=nDisplayButton7 Scale=1.0
AxisName="AxisLeftController_Y" Key=nDisplayButton9 Scale=-1.0
AxisName="AxisRightController_Y" Key=nDisplayButton6 Scale=1.0
AxisName="AxisRightController_Y" Key=nDisplayButton8 Scale=-1.0
AxisName="AxisLeftController_X" Key=nDisplayButton11 Scale=-1.0
AxisName="AxisLeftController_X" Key=nDisplayButton13 Scale=1.0
AxisName="AxisRightController_X" Key=nDisplayButton10 Scale=-1.0
AxisName="AxisRightController_X" Key=nDisplayButton12 Scale=1.0
AxisName="AxisRightController_Y" Key=nDisplayAnalog0 Scale=-1.0
AxisName="AxisLeftController_Y" Key=nDisplayAnalog1 Scale=-1.0
AxisName="AxisRightController_X" Key=nDisplayAnalog2 Scale=1.0
AxisName="AxisLeftController_X" Key=nDisplayAnalog3 Scale=1.0

Note that the DefaultInput.ini file can be modified if needed, to reverse an axis for example.

Other lines#

The rest of the file doesn't require any modifications.

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

Skyreal supports command line arguments for the NDisplay mode, allowing for an easier configuration of the base parameters. Click here for more information.

WARNING In the case of a CAVE, the "Simulation" parameter is mandatory. Be careful that the simulation is located at the same place on every PC. We also recommend using the "Local = true" parameter to get the license file. Don't forget to copy the license file on every PC at this location:

C:\Users\username\AppData\Local\Skydea\licenses

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:

  • Start the Dtrack record
  • Start the VRPN server
  • Start the NDisplay Launcher
  • Start the NDisplay Listener on every cluster PC
  • Click on the Run button

Skyreal should now start on your system, 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 Skyreal is blocking on the standard interface or on the loading screen, make sure all the files (project, simulation, config file, licenses) are identical on every PC and copied in the exact same location.
  • If you have created a custom VR interface, don't forget to copy the file on every PC of the cluster at this location: C:\Users\itsky\AppData\Local\Skydea\skr\0.0\Interface\VR

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