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. You can give the path to the installer exe, or the folder where it's located, but each folder needs to contain one and only .exe installer and .skrapp data file.

"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. Some useful parameters can be : -ExecCmds=\"EnableAllScreenMessages\" : to enable on screen logging -ABSLOG=\"C:\\CustomPath\\CustomFileName.log\" : to log to a specific location -DebugClusterSync : custom param to debug synchronisation between your nodes. If you want to see the debug info on the screen, it's better to use also with EnableAllScreenMessages

All those example parameters only work with a Development version of Skyreal installed. You can also add any other unreal launch parameter, or use your own ones.

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

To avoid any issues with Windows resizing your window because it is larger than the size available, it is highly recommended to hide the taskbar. To do this, right click on the Windows taskbar, click on Taskbar Settings, then in Taskbar behaviors category, check Automatically hide the taskbar and uncheck Show flashing on taskbar apps.


powerwall

It is also highly recommended to disable any windows DPI scaling on your nodes to avoid unexpected behaviour.

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.

"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, ...

The transforms should be placed with the same rotations as the screens, I.E red arrow pointing away from the viewpoint.

If you want to increase the bracelet's scale, you can add a ?scale=wantedscaling after the name of your component. For example, to have the bracelet be 2,5x bigger, name your component bracelet_origin?scale=2.5 However this scale parameter is not available with menu_origin, a solution to have it appear bigger is to place the transform closer to you.

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 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, input devices like the VenomX are managed as a gamepad. Hence, if one or more Input devices 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.

In the same folder, you can run the server manually to test communication by pasting your config to a vrpn.cfg named file next to the server, and then launching vrpn_server.exe.

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

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.

Skyreal closes as soon as it opens

This issue is often related to starting Skyreal in FrameSequential mode. To troubleshoot this, try to first launch all your node in Mono. If this works, ensure Stereo mode is correctly enabled on all the nodes, both in nVidia settings as well as in windows settings before enabling FrameSequential mode again.

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.

Communication issue to/from VRPN

If you have trouble to receive your tracking data in VRPN, or to receive tracking data in Skyreal from VRPN, the issue could be caused by your firewall blocking the data. Normally when you start vrpn_server for the first time, you should have had a windows popup asking you to authorize it to the firewall, but on some computers with advanced firewall it sometimes doesn't happen. To fix this, you can manually add a rule to your firewall for vrpn. To do this, search for Windows Defender Firewall with Advanced Security in the search bar, then click on the Inbound Rules tab. Click Action then New Rule to create the rule.

Inside the New Rule Select Program then click next and select the path to vrpn_server.exe, located in DataDirectoryPath (C:\.skrdaemon by default), then \username\Vrpn folder, or inside your CustomVrpnPath if you're using one.


powerwall

Then click Authorize connection, for profile select the relevant profile (If vrpn is sending data to your own computer, you should select Public), then name it as you want and click create.

If you want to have an ever more secure rule, click Properties on your newly created rule. In Protocols and ports, you can only authorize one port for vrpn. To do this, select UDP in Type of protocol, then in Local Port or Distant Port (depending on if VRPN is receiving data from a tracking software on your computer or on a remote one), select Specific port and type the port VRPN is receiving data from (for ART/DTrack, this is usually port 5000 for example).


powerwall

If VRPN is receiving data from a software located on the same computer, you can also go in the Advanced Tab, in the Type of interfaces sections click Personalize and then select Local Network under This type of interfaces to only allow VRPN to receive data from your own computer.


powerwall

I have a visible difference in colors/lightning/shadows on the edges between my nodes

This is caused by Unreal only rendering the scene of your node using the objects that are visible on it. So if an object is casting a shadow on one node but the object is not visible on your other node, the shadow created by it will also not be there in the node even if it should, causing a visual difference between your nodes.

To solve this issue, unreal has a feature called Overscan, which will render the scene in a bigger zone than what's visible on screen to account for objects located outside of it. To enable it, you can go edit your nDisplay config in the unreal editor, select any Viewpoint in the bottom part, then enable Overscan, from here, using either Pixels or Percentage mode, select how much more you want Unreal to render your images on any given side/direction. Be careful that this feature comes with a performance cost.


powerwall

License configuration

With the latest version of Skyreal and Deck, you don't need to setup a Skyreal license for each cluster node anymore, Deck manages the license authentication of the nodes internally.

If the cluster nodes are launching and closing soon after, there maybe a communication error with deck preventing license authentication. In this case, you still have the opportunity to use regular Skyreal licenses. Please contact the Skyreal VR support team so they can generate the license files and follow this guide for setting them up :

Logs collection

To further troubleshoot your cave, you can find after each session the Unreal logs for all daemon will be automatically sent on the PC launching the session with Deck, inside the DataDirectoryPath (by default C:\.skrdeck), then the user's name and finally CaveDaemons\Logs folder, provided you have installed a development version of Skyreal, and it's installed in a location where it can create logging files. By default, the ProgramFiles folder is secured and does not allow file writing for logs, so it is recommended to change your daemon's SkyRealInstallLocation setting to a non protected folder.

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.
  • "CustomVrpnPath" : string = To specify a custom folder path for vrpn server. This option can be used to have the vrpn server located in a wanted folder, sometimes for easier management, or also if you're using a custom version of the vrpn server. If you do so, just place your vrpn_server.exe inside your CustomVrpnPath and the daemon will use this vrpn server instead.

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