Skip to main content
Version: Next

Cave and Powerwall

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

  • Deck / XRCenter - To launch a CAVE / Powerwall session on your selected experience you need to launch it through Deck that you must have previously configured (either standalone or connected to XRCenter)

  • Cave Daemon - A Cave Daemon needs to be installed on every computer that run a cave node. It will then manage skyreal installation and launching sessions for you. If the computer where deck is installed is also a node, it needs a cave daemon (same goes for powerwall)

Cave Daemon Configuration

First you will need to install cave daemon on every computer that is running a node.

For this just use the cave daemon installer or install it through auto updater.

Most of the time you will not need to change any settings for the cave daemons, but in case you need here's a reference of all the settings you can change

If you want the daemon to be started automatically when the session is opened, you can install it as a service. Navigate to the daemon install location (by default : C:\Program Files\Skydea\1.19\CaveDaemon), open a cmd as admin there and type : .\Skr.CaveDaemon.exe service install

then to start it either launch it by double clicking on the .exe or type .\Skr.CaveDaemon.exe service start

Service install is done automatically if installed though auto updater with the option enabled

You can use service stop and service uninstall when you want to disable the service

Every other setting will be managed on the master PC where Deck is installed

Deck configuration

In deck you first need to enable the cave management plugin. For this, edit cave-settings.json in deck config folder (C:\ProgramData\Skydea\deck by default) and add this :

"OptionalPlugins": [ "SkyReal Deck Cave Management" ]

All settings related to cave/powerwall will then be managed through the cave-settings.json file located in deck config folder (C:\ProgramData\Skydea\deck by default).

Every time you edit this file directly, don't forget to restart deck so that changes are taken into account.

Here are the settings you will find in this file :

"NDisplayConfigurationPath" : string = Path to your ndisplay configuration file used to setup your screen configuration. See here for more information

"VrpnConfigurationPath" : string = Path to your vrpn configuration file used for skyreal to read tracking and input data. See here for more information

"SkyrealVrInstallerPath" : string = Path to SkyReal's installer that will be sent to Cave Daemons for installing and also updating SkyReal. This value can be changed inside deck directly using the Import button !

"ExtensionsInstallerPaths" : array of string = Path to all extension's installers you also want installed on Cave Daemons.

"VrpnSettings" : null or vrpnsettings = here you have the option to setup a vrpn server that will be launched alongside SkyReal when starting a cave session. See VRPN configuration to see the setting you have for vrpn.

"DaemonsSettings" : array of daemon settings = This is where you will enter the information of all the daemons you have installed. If you have multiple nodes running on the same computer, create 2 daemon settings with the same IP adress but a difference NodeIdentifier. Here's a reference of all the deamon settings you can edit :

Daemons Settings reference

"DaemonIp" : string = IP adress of the daemon used for communication. If you have setup a custom port for the daemon, you will need to add :CustomPortNumber at the end of the Ip too.

"NodeIdentifier" : string = The name of the node. The name needs to match the node name given in the ndisplay config file.

"RenderingMode": string = Rendering mode used for the node. Possible values can be "Mono", "SideBySide", "TopBottom", "FrameSequential". Default is mono.

"IsPrimaryNode": bool = Used to say which node is the primary (used for config synchronization, the one sending save data to deck, etc ...). If no IsPrimaryNode is true the Primary Node will be the first Node found in DaemonsSettings.

"DaemonAdditionalParameters" : null or string = If you want to send custom Launch parameters to a specific SkyReal node.

"DaemonAdditionalParameters" : string

For choosing a specific screen configuration when SkyReal opens, you have 2 possibilities :

"TargetScreenId" : null or int = used to open the node in fullscreen on the screen that has the correspond Id in windows settings.

"CustomWindowSettings" : null or CustomWindowSettings = used if you need a more detailed window configuration. CustomWindowSettings contains "ResX" : int and "ResY" : int for specifying the window size, and "PosX" : int and "PosY" : int settings for specifying the window's target position. If you have 2 1080p screens side by side and want it on the right screen this will be "PosX" : 1080 for example. You can move the screens in Nvidia Control Panel manage multiple screens window to help you find the coordinates of your screens :


powerwall

NDisplay Configuration File

The .ndisplay configuration file is used to configure you room setup, such as the different device and screens, their position, etc.

As of Unreal Engine 5.0, this configuration can now be done visually in the Engine for an easier setup. To do so, either create an empty Unreal Engine project and enable the NDisplay plugin or just use the NDisplay Starter Project. Then, create an asset of type nDisplayConfig


powerwall

You can then open this asset to edit your config.

Room configuration

In the top part of the screen, this is where you will setup the configuration of your screens. Select the nDisplayScreen you want to edit.


powerwall

You can then change the size of the screen using the scale parameter : Y value represents the screen width, and Z value the screen height, both are in centimeters. You can also move and rotate the screen around using the gizmo or the location parameter : the goal is to measure the physical distance between the screens and the tracking origin and to replicate it in ndisplay.

Create new nDisplayScreens and repeat this step for as many screens as you have :


powerwall

If you have multiple viewpoints, you can now have more than one in the ndisplay config. Then you'll need to link them to their related tracker in the VrpnConfigFile by writting their name in the "AttachedViewpoints" array. If you need to have an offset between the viewpoint tracker and your viewpoint, you can attach your viewpoint under an NDisplay Transform Component and specify the name of the transform component instead in "AttachedViewpoints". This will ensure the viewpoint is attached to the tracker with the same offset as you have in your config.

If you want the SkyReals menus to be displayed at a specific location in your Cave when using the Cave Docked Interfaces Mode (often located at the center or on the sides of your screens), you can drop NDisplay Transform Components with specific names in your config file to tell SkyReal where to place these menus. The names you can give are the following :

"bracelet_origin" : if you just want the bracelet to be placed there. You can play with scale of the transform to make the bracelet bigger or smaller.

"bracelet_origin_right", "bracelet_origin_left" and "bracelet_origin_extended" : if you want to setup custom bracelet locations for every bracelet setting you have in SkyReal.

"menu_origin" : location for all other skyreal menus, like laser pie menu, tool picker, ...

Cluster nodes

In the bottom part of the screen, this is where you can setup your cluster nodes. Cluster nodes are the computers on which your powerwall will run.

Here you will need to setup the nodes to have the same names and IP adress as in deck's config file.


powerwall

Your newly created node will now contain a viewport by default. You can also decide to have multiple viewports per cluster node. To receive an image on your viewport, you need to change the settings as follow :

Set ViewOrigin to DefaultViewPoint Set ProjectionPolicy - Type to simple For the Projection Policy - Screen setting select which nDisplayScreen your node will render.


powerwall

You can also read the detailed Unreal documentation here nDisplay 3D Config Editor in Unreal Engine to help you setup your ndisplay config file.

When you are done, click export at the top of the window to export your config as a .ndisplay file. This file is viewable as text so you can also edit it manually. If you want to edit your config in the editor again, either save your unreal project or use the import button in the ndisplay config editor to retrieve the config from a saved .ndisplay file.

Skyreal VR VRPN Config File

You also need to setup a .json To download example file here file to configure how your trackers and inputs will behave inside Skyreal VR. Here's how to configure it :

Settings written in bold are required , while settings in italic remain optional.

The first setting needed is APIVersion : this setting is mandatory to know the version of the config file, as of now the version is 1.

The second setting is UpdateRate : this is an optional setting to configure the rate at which Skyreal VR will retrieve inputs from VRPN (the default value if no setting is given 120Hz)


powerwall

You then need to write the VRPNConfig array, this array contains the sources you receive tracking and input from.

To create a source, it need to have an Adress field. This is the ip adress of the computer where the VRPN Server runs.

Devices

For a same Adress, you can have an array of Devices : a device consist mainly of its DeviceName, corresponding to the name of the device given in vrpn.cfg : for example DTrack or XInput0.

For a device receiving tracking values, you can add a BaseTrackingOffset value to change the tracking values received from the tracking system : for example if the tracking origin is too high/too low, if the tracking system values need to be scaled by a factor of 10, ... You can have Location, Rotation and Scale settings. You can also write your AxisRemap settings here if needed instead of repeating them for every tracker.

You can then setup the type of inputs you will receive from this Device : these can be arrays of Trackers, Buttons, or *Axis :


powerwall

Trackers

For each Tracker, here are the settings you can configure :

TrackerType : How the tracker will be used in Skyreal VR, the values can be HeadTracker, LeftControllerTracker, RightControllerTracker or AdditionalTracker.

Channel : The channel on which VRPN sends this tracker data.

AxisRemap : This setting can be used when tracking data sent by VRPN is not sent in the same coordinate system as Unreal. For ART Tracking, this is usually X = Y and Y = X. You can write it for each tracker or in the device field to have it applied to every subsequent trackers.

Offset : you can tell Skyreal VR to offset the controller meshes inside Skyreal VR from the data received from VRPN, either by Location or Rotation.

AttachedViewpoints : if you have more than one viewpoint in your ndisplay config file, here you can specify a list of all the viewpoint's names that are attached to your tracker.

Buttons and axis

For Axis and Buttons, the main settings are the same :

InputName : the name of the Input triggered in Skyreal VR when this button is pressed. A list of all the input names can be found at the bottom of the page.

Channel : The channel on which VRPN sends this data.

Axis also have additional settings, such as :

Deadzone : to have a deadzone on the axis values received by vrpn

Scale : to put a scale on the axis values received by vrpn. A scale of -1 can be useful to invert an axis.

VRPN Configuration

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

VRPN is used by skyreal to receive input and tracking data from different devices. Often times your tracking system (optitrack, motive, ...) incorporates a vrpn server that sends tracking data for you. But SkyReal also needs inputs data to be sent from vrpn. Now, you have the option of automatically starting a vrpn server alongside SkyReal when launching a cave session when using Cave Daemon.

To do this, edit cave-settings.json in deck config folder (C:\ProgramData\Skydea\deck by default) with the following field :

"VrpnSettings" : and the following options :

"Ip" : string = the adress of the daemon that will run the vrpn server. This can be a daemon that is also already running a cluster node, or a daemon that is installed just for the purpose of starting the vrpn server. If you want to have vrpn launched on the master PC where you already receive you tracking data and have deck installed, just install a daemon on it and type localhost as the Ip.

"CustomPort" : string = if you want your vrpn server to use a custom port. The default vrpn port is 3883 but this will be needed if you are running the vrpn server alongside the one already run by your tracking software. If you change the vrpn port, don't forget to add :portnumber after your Adress in the VrpnConfigFile.

"Config" : string : here you will need to write the devices your vrpn server will be listening to. This is the equivalent of what you would write in a vrpn.cfg file. Don't forget to escape every line of your config with \n.

For example, to receive tracking data from ART using DTrack, you need to add a DTrack device as well as the port used by DTrack to send data (port 5000 by default).

In VRPN, the VenomX device is managed as a gamepad. Hence, if one or more VenomX are used, a vrpn_XInputGamepad must be added too.

vrpn_Tracker_DTrack DTrack 5000
vrpn_XInputGamepad XInput0 0
vrpn_XInputGamepad XInput1 1

needs to be written like this in cave-settings.json config file :

"Config" : "vrpn_Tracker_DTrack DTrack 5000\nvrpn_XInputGamepad XInput0 0\nvrpn_XInputGamepad XInput1 1"

To find device names you can use for vrpn server configuration, you can see the vrpnexample.cfg file located inside of Cave Daemon install's location, VRPN folder.

The StartTest.bat (located in the same directory) can be used to check which data is being sent by the server, after editing it to match the device name you have setup for your server.

Starting your cave session

After the setup is done, you should have a cave settings button appear on the top right of your experience inside of deck.

When you click it you should see all the daemons you have setup in your config file as well as their connection status.

Once all the daemons appear as connected, you can click the update daemons button to install everything required on every node of your cluster. This will start SkyReal's installation if the installer version is different from the one on the machine, this process can take around 5 to 10 minutes. You can click on the Import button under SkyReal VR Installer Path to pick the location of your SkyReal installer.

This will also send the ndisplay and vrpn config files to every node of the cluster, so don't forget to click update daemons again every time you make a change to them.


powerwall

Once the installation is complete, you can close this window and press the Launch Cave button to start the cave session.

You can then choose to click Kill SkyReal on Daemons button to end the session and upload your save back to deck.

Troubleshooting

License configuration

As of the current version you still need to have a SkyReal license setup on each computer running SkyReal. If the cluster nodes are launching and closing soon after, maybe you forgot to setup it. Follow this to setup your SkyReal licenses

Screen remains black

If the screen remains black after launching, this can usually mean that there is a connection issue between all of the nodes of you cluster preventing from starting the session. You can double check the NodeIp and NodeName inside of your ndisplay config file as well as your cave-settings config deck config file to make sure they match your configuration. You can also check that all the nodes are able to ping each other and that skyreal is allowed through the firewall (you should usually have a windows popup asking it to you).

If the black screen appears only after you moved your glasses to be tracked, this can also be an issue with you tracking data having the wrong AxisRemap that makes SkyReal think your glasses are located on the other side of the screen.

Collab support

SkyReal collaborative session options have been disabled with Cave support due to unreal limitations on multiplayer support in a cave setup. There is still a way to have a multiplayer experience if you are just using a Powerwall.

In the cavedaemon.json config file, if you have only one daemon you can add the following arguments in "DaemonAdditionalParameters" : " -IsCollab="True" -IsServer="True"

This will launch your powerwall as the server and you can then have other skyreal instance join it.

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

Cave Daemon Settings

The daemon config file can be found in C:\ProgramData\Skydea\cavedaemon\cavedaemon.json The settings you can edit on cave daemon are the following :

  • "SkyRealInstallLocation" : string = Custom path used when installing SkyReal, if not defined will use default path (C:\Program Files\Skydea\...)
  • "ExtensionsInstallLocation" : string = Custom path used when installing SkyReal extensions, if not defined will use default path (C:\Program Files\Skydea\...)
  • "DataDirectoryPath" : string = Path where temp data like maps will be stored, if not defined will use default path (C:\.skrdaemon)
  • "RpcPort" : int = If you want the daemon to use a custom port, if not defined will use default port (54564)
  • "ShutdownTimeout" : TimeSpan = If you want the daemon to shutdown automatically after a given, if not defined it stays open indefinitely
  • "CustomSkyRealExePath" : string = If you have a custom skyreal version not installed through an installer, you can launch it instead of the installed version using this parameter. This is not recommended.

Input Names

Buttons

Mostly used :

These are the buttons for opening the Pie Menu on the right and left controller :

VrMenuButtonRightController VrMenuButtonLeftController

These are the main interaction buttons on the right and left controller :

ActionButtonRightController ActionButtonLeftController

These are buttons to increase and decrease the camera speed :

IncreaseSpeed DecreaseSpeed

These are bindings if you want to move using buttons instead of sticks :

LeftControllerUp LeftControllerDown LeftControllerLeft LeftControllerRight RightControllerUp RightControllerDown RightControllerLeft RightControllerRight

These are custom buttons that you can use in your own projects

VRPNInputAction*

Complete list :

VrMenuButtonRightController
VrMenuButtonLeftController
ActionButtonRightController
ActionButtonLeftController
ClickMouseRightButton
ClickMouseLeftButton
ClickMouseMiddleButton
RightKey
LeftKey
UpKey
DownKey
AnyKey
EnableMoveRightController
EnableMoveLeftController
CtrlButton
GamepadA
GamepadB
GamepadY
LeftControllerUp
LeftControllerDown
LeftControllerLeft
LeftControllerRight
RightControllerUp
RightControllerDown
RightControllerLeft
RightControllerRight
VRPNInputAction1
VRPNInputAction2
VRPNInputAction3
VRPNInputAction4
VRPNInputAction5
VRPNInputAction6
VRPNInputAction7
VRPNInputAction8
VRPNInputAction9
IncreaseSpeed
DecreaseSpeed
SelectAll
ExitVrActionButton
TutorialButton
IncreaseCameraSpeed
DecreaseCameraSpeed
CompassXAxis
CompassYAxis
CompassZAxis
LogButton
CompassGrab
CompassRot
HideToggle
PauseMenu
ShowPartInfo
OpenRightMenu
Remove
FitTo
Save
HandheldCamera
Ping
TakeScreenshot
Isolate

Axis

Mostly used :

These are the stick values for the right and left controller on the X and Y axis :

AxisRightController_X AxisRightController_Y AxisLeftController_X AxisLeftController_Y

These are custom axis that you can use in your own projects

VRPNInputAxis*

Complete list :

AxisRightController_X
AxisRightController_Y
AxisLeftController_X
AxisLeftController_Y
MouseXAxis
MouseYAxis
MouseScrollWheelAxis
AxisOrientation_X
AxisOrientation_Y
AxisPosition_X
AxisPosition_Y
AxisPosition_Z_P
AxisPosition_Z_M
VRPNInputAxis1
VRPNInputAxis2
VRPNInputAxis3
VRPNInputAxis4
VRPNInputAxis5
VRPNInputAxis6
VRPNInputAxis7
VRPNInputAxis8
VRPNInputAxis9