Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

About nDisplay

The Unreal Engine supports advanced Igloo structures through a system called nDisplay. This system addresses some of the most important challenges in rendering 3D content simultaneously to multiple displays:

...

https://youtu.be/DTAW0i7NSoo

Why Use nDisplay over the Unreal Toolkit Plugin

There are some inherent problems with the Unreal toolkit that are difficult to overcome. These include:

...

Warning

The only current issue with nDisplay is the lack of a method to input warps generated by the Igloo system. Requiring the use of scalable to do curved screens at this stage.

PC Specification for Igloo

The main machine will be the same as the ICE machine. It should be high specification as it will be the center for the models, as the master node. However it will only need to output a single display, and not output anything to the projectors (only the console monitor)

However, it will be responsible for starting Unreal and telling all the other PC’s what to do, as it will be the Master node on the above diagram.

The individual machines will be infrequently used, and will need to be ‘gamer’ ready. This is due to Unreal not outputting it’s best when using Quadro based graphics cards. It also means they can be off the shelf cheaper products with a decent warranty. They can also be specified as smaller form factor machines to fit nicely into a server rack.

A company called MK1 Manufacturing make a wide range of lenovo rack mounting solutions, and could be commissioned to make one for their gaming machine chassis.

Possible solutions could include the LOQ machine, and the Legion T5 machine.

Info

Further conversations need to happen with Bill to recommend something suitable for a cluster solution.

Setting up nDisplay within Unreal

Prerequisites

A New Project

Epic games have kindly given us a template that sets everything up for you. If this is your first time using nDisplay, Igloo highly recommends creating a new project using this template, and experimenting with the config file.

...

Finally, select a location for your new project, and wether weather you would like to include Starter Content, and enable Raytracing. I would recommend disabling Raytracing for your first project unless you’re familiar with it.

Always Disable Raytracing. It’s not fully supported by nDisplay

...

Upon selection of Create Project the editor will begin to unpack and create the project at the location you have specified. This might take a long time depending on your computers specifications.

Info

It’s a good idea to create the project within a location that is easy to share on a network. This makes it a lot easier to create the cluster further into the nDisplay pipeline.

Existing Project

  1. Open your project, and navigate to the Plugin’s window. Search for nDisplay and Enable the nDisplay plugin. This plugin is included in Unreal 2.46 and newer.

...

Tip

You’ve now added everything to an existing level that is required to get nDisplay working correctly!

For advanced systems, please refer to the Unreal Documentation for more guidance.

Building a project

[How to build the project, and where to place it once built. Adding the listener.exe, and where to find that. Placing the built version within a network shared location./]

...

Info

Whilst at this location it’s also a good idea to create a shortcut to the nDisplayLauncher.exe by either adding a shortcut to the desktop, or pinning it to your start menu. We will be using this application further in the process.

Creating the config file

A config file is required to inform each of the machines within the nDisplay cluster, on how to create the various nDisplay components. Luckily Epic has given us a lot of examples of how this configuration file should look. They can be found at this location within your engine folder:

...

Note

If you edit a config file and save it, you will need to load a different config file, and then re-load your original config file to see the changes you’ve made. Or you could edit the DisplayClusterRootActor.h and add a reload button in.

Config file with Scalable

Within Igloo structures, instead of creating the setup using the config file, we can create a barebones file, and instead use Scalable to create the screens, blends, and systems.

...

For instructions of editing scalable configuration file, it can be found further into this guide.

Using Scalable to generate warp and blend files

Setting up Scalable for the first time

Once you’ve registered for scalable, purchased a license, or signed up for the free trial license, you will be given a download link for Scalable’s software; Display Manager.

...

You will be greeted with a wizard type system, with 4 pages. The first being:

Display Clients

The Display Clients panel presents an interface that allows you to setup the connections to the remote computers.  The right side of the panel shows the displays connected to the current system, while the left side shows all available Display Clients.

...

Use the Display Client on the Local Computer

If the computer running  Scalable Display Manager is the only computer used in the system, select the radio button Use Local Display Clients Only.  No additional setup is required in the Display Clients panel.

Display Clients on Remote Computers

If your Scalable Display Manager configuration will require connecting to one or more remote computers, select the radio button for Use Remote Display Clients.

Set Up Remote Computers

Note

One of my Display Clients is not showing as a client available on the network

Display Clients are detected on the network using multicast. Standard network troubleshooting is appropriate when they do not appear in the list of Display Clients available on the network. Make sure that:

  • Scalable Display Manager is running on the remote Display Client.

  • The Display Client is ping-able on the network.

  • The firewall allows Scalable to communicate over the network.

  • The Display Client is on the same subnet.

Add a Display Client to the System

Scalable Display Manager automatically detects all Display Clients on the network subnet.  The status of each Display Client is displayed in a colored square to the left of its network identifier.

...

Warping and Blending in the graphics card requires Nvidia Mosaic Mode.  Please check the website for the latest recommended version of the Nvidia Quadro driver.

Projectors Panel

...

The Projectors panel should accurately reflect the number and resolution of the displays connected to your computer, however Scalable Display Manager can only auto-detect certain common resolutions. If it is unable to detect the current resolution of your display(s), the most common response is that it will simply show a single display at the combined resolution of all your projectors.

...

Here is an example of a 20% overlap setup:

...

Enter the Projector Arrangement

  1. Select the physical arrangement of the projectors: Tiled, if the projectors are next to each other, or Stacked, if the projectors are on top of each other.

  2. Select the number of projectors in a row.

  3. Select the number of projectors in a column.

  4. Click Redetect Displays to save the settings.

Order the Display Clients

The order of the display clients will have a direct effect on the projector numbering. To properly order projectors, set the displays such that the left-most projectors on the blended display appear first in the list. To change the order use the arrow key to move the computer IP up or down.

...

Cameras Panel

...

Basic Camera Configuration

Verify that the number and type of cameras detected by Scalable Display Manager correspond to your system. If the Automatic type doesn't detect the camera configuration properly, please choose your camera type manually.

Info

If multiple cameras types are connected to the computer, make sure to select the camera type you will use to calibrate.

Advanced Camera Configuration

The Advanced Camera Configuration allows the user to grab a subset of the total cameras and arrange the order based on serial numbers.

...

Data Collection

...

Adjust the Camera Settings

For a proper calibration, it is necessary to focus the camera and adjust its exposure settings.  If the camera captures an image that is too bright it will have difficulty detecting the calibration spot patterns.  Similarly, not focusing the camera will reduce the accuracy of the camera detection and may cause artifacts in the resulting warp and blend.  It is thus important to make sure the camera(s) can see the entire screen and are capturing well-focused and properly exposed images.

Camera Brightness

Note

The projectors must appear to be brighter than the ambient light on the screen. If the projectors are coming in at odd angles and have a significant intensity falloff, then the darkest portions of the projectors should be much brighter than any stray light on the screen

...

If after manual adjustment the image brightness still has saturation problems, click the Auto Tune button. A series of pictures will be taken to auto-adjust the camera.  If the image is not normally saturated after the Auto Tune, you may need to manually adjust the camera's brightness. Follow the instructions below for your particular camera.

Begin Data Collection

Click Begin Data Collection.

...

Next, two images will be displayed on each projector, starting again with the first projector and going in order to the last.  The first image will be a 5-dot pattern which is used to determine the center of the projected image. The second image displayed is the grid pattern which is used to map where the pixels are falling on the screen.

White Pattern

5 Dot Pattern

Grid Pattern

Image ModifiedImage ModifiedImage Modified

What to do if an Error Occurs

Most errors encountered during calibration are caused by poor camera positioning or improper saturation of the camera image, resulting in the inability of the software to detect the calibration patterns being displayed. When an error occurs, click the link labeled Click here to troubleshoot this error in the error message window. This will open a browser with the suggested solutions for this particular issue.

...

Data Collection Error Actions

Some of the most common errors encountered during the data collection process have been included in the Error Actions. Error actions allow you to ignore issues with the data collection images which do not inhibit the data collection.

...

The software can not discern the difference between a projected image that does not fill the screen and one that fills the screen but spills off. 

End Calibration: In this case, the calibration should be stopped so that the camera can be re-positioned to see the entire projected image.

Image Modified

Ignore and Continue: The error action is expected and triggered because the projector is overshooting the screen. Continuing will not cause any issues.

Image Modified

Choice

Description

Remember this action for this projector for session

Do not stop the calibration for this error on this projector until the software is restarted

Remember this action for this projector forever

Never stop the calibration for this error on this projector

Remember this action for all projectors for session

Do not stop the calibration for this error on any projector until the software is restarted

Remember this action for all projectors forever

Never stop the calibration for this error on any projector

Projector Visibility

Be careful when editing

Removing a projector from the visibility list for a camera can result in unwanted warp and blends and often cause the system stop calibrating

...

Scalable setup within nDisplay

Once you’ve got your scalable calibration correct, you’ll need to enable perspective mode to export the data to Unreal. To do this click on the Perspective button on the left panel, and then tick the ‘Use Perspective Mode’ button on the menu. You will then need to re calibrate to generate the perspective outputs.

Essentially that is all that’s required for standard nDisplay, from Scalable’s perspective.
However, if you’re using head tracking, it is required that you adjust the eye level to the correct height, for where the exact center of the room will be.

Exporting Data to Unreal

Once your screen has been calibrated using the Scalable system, the master machine will have saved the DataSet to it’s C:/ drive, in the following folder:

...

Note

Don’t Cut the files, as they are still referenced by Scalable. It may cause a re-calibration resulting in a new dataset.

Creating Scalable nDisplay config file

This can be created from scratch, or by copying an nDisplay config file, our our sample file below.

Expand
titleExample config file

You are welcome to copy this file, and expand on it. You should save it as a .cfg.
It’s a 3 Igloo Media Server (IMP) 3 Projector system.

Code Block
# Tracker
[input] id="ViveVRPN" type="tracker"  addr="openvr/controller/LHR-8708C47F@10.1.5.169:3884" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front="Y" right="-X" up="Z"

Code Block
#####################################################################
# Igloo nDisplay Example Configuarion
#
# Note:
# Before use, make sure all settings correspond to your system.
#####################################################################

# Config file header.
[info] version="23"

# Cluster nodes
[cluster_node] id="IMP1" addr="10.1.5.110" window="window1"
[cluster_node] id="IMP2" addr="10.1.5.247" window="window2"
[cluster_node] id="IMP3" addr="10.1.5.169" window="window3" master="true"

# Application windows
[window] id="window1" fullscreen=true viewports="viewport1"
[window] id="window2" fullscreen=true viewports="viewport2"
[window] id="window3" fullscreen=false WinX=1920 WinY=0 ResX=1920 ResY=1080 viewports="viewport3"

# Projection policies
[projection] id=proj_easyblend_1 type="easyblend" file="D:\LocalCalibration\ScalableData.pol" origin=easyblend_origin scale=1
[projection] id=proj_easyblend_2 type="easyblend" file="D:\LocalCalibration\ScalableData.pol" origin=easyblend_origin scale=1
[projection] id=proj_easyblend_3 type="easyblend" file="D:\LocalCalibration\ScalableData.pol" origin=easyblend_origin scale=1

# Viewports
[viewport] id="viewport1" x=0 y=0 width=1920 height=1080 projection=proj_easyblend_1
[viewport] id="viewport2" x=0 y=0 width=1920 height=1080 projection=proj_easyblend_2
[viewport] id="viewport3" x=0 y=0 width=1920 height=1080 projection=proj_easyblend_3

# Cameras
[camera] id=camera_static loc="X=0,Y=0,Z=0" tracker_id="ViveVRPN" tracker_ch=0

# Scene nodes
[scene_node] id=cave_origin       loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"
[scene_node] id=wand              loc="X=0,Y=0,Z=1" rot="P=0,Y=0,R=0"
[scene_node] id=easyblend_origin  loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"

# Tracker
[input] id="ViveVRPN" type="tracker"  addr="openvr/controller/LHR-8708C47F@10.1.5.169:3884" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front="Y" right="-X" up="Z"

# General settings
[general] swap_sync_policy=1

# Network settings
[network] cln_conn_tries_amount=10 cln_conn_retry_delay=1000 game_start_timeout=30000 barrier_wait_timeout=5000

# Custom arguments
[custom] SampleArg1=SampleVal1 SampleArg2=SampleVal2

Scalable Config Explained

Header Info

[info] version=”23”

This is the config file header, it specifies the version of Unreal that it supports. It’s best to leave this at default “23” otherwise it causes issues.

Cluster Nodes

[cluster_node] id="node_main" addr="10.1.5.110" window="wnd_all" master="true"

...

Additionally you can also specify:
- which node is the master (there can only be one)
- which node has the sound output (master by default)
- The various ports used for synchronization between the machines (ports 41001 → 41003 are used by default)

Windows

[window] id=wnd_all fullscreen=false WinX=0 WinY=0 ResX=1920 ResY=1080 viewports="vp_1"

...

Additionally, you can also specify ‘Fullscreen’ which is useful if you have a single display output (or a mozaic/eyefinity output) which will increase game rendering capabilities.

Viewport

[viewport] id=vp_1 x=0 y=0 width=3840 height=1080 projection=proj_easyblend_1

...

The projection value, explained below, is which projection policy will be used

Projection

[projection] id=proj_easyblend_1 type="easyblend" file="D:\LocalCalibration\ScalableData.pol" origin=easyblend_origin scale=1

...

Info

If you are using one machine, with multiple screens, each screen will have it’s own .pol file.

Camera

[camera] id=camera_static loc="X=0,Y=0,Z=0" tracker_id="ViveVRPN" tracker_ch=0

...

parent - ID of the parent component, default is VR root
tracker_id - the ID of the tracking device, default there is no tracking.
tracker_ch - the ID of the tracking device’s channel (default 0)
eye_swap - swap eyes if in stereo mode; default is false.
eye_dist - distance in meters between the eyes, default is 0.064.
force_offset - force’s a mono camera to behave like a stereo camera, eye_offset works for this behavior too.

Scene Nodes

[scene_node] id=cave_origin  loc="X=0,Y=0,Z=0"   rot="P=0,Y=0,R=0"
[scene_node] id=easyblend_origin_1 loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0"

...

With simple camera systems, a projector will be paired to a scene object, which would require you to position, or offset the scene object to place the projector correctly. With scalable displays this is not the case, you only need to create as many scene objects for your projectors, the rest is handled by scalable.

Input

Code Block
[input] id="ViveVRPN" type="tracker"  addr="openvr/controller/LHR-8708C47F@10.1.5.169:3884" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front="Y" right="-X" up="Z"

...

type - The specific type of hardware used, options include:
tracker for a tracking device.
analog for a device that produces axis data.
button for a device that produces Boolean button data.
keyboard for a standard computer keyboard.
addr - the address of the server data, if using OpenVRPN you will need to change the IP address to match the machine hosting the server (port 3884 is default), and then also change the Tracker ID which is available in SteamVR Options → configure trackers.
loc - Initial offset (meters)
rot - Initial rotation (Euler)
front - axis mapped to forward direction
right - axis mapped to horizontal direction
up - axis mapped to vertical direction

Other settings

The rest of the settings are explained in more detail within the example files. 99% of the time the defaults are perfect.

Creating a network storage solution

Making nDisplay extremely easy to update and configure requires the use of a NAS (network accessible storage) device. Without it, you would need to manually update each machine with a new version of the Unreal build, and configuration. Instead, all the machines can work from one file, on one machine, that is shared with all of them.

...

It would be beneficial to create a script that copies the files from the shared location, to a standardised local location on the individual machines, whenever they are updated. This stops any errors that could occur due to the same files being accessed by different machines.

nDisplay Launcher

Once you have your Project deployed successfully to all the computers you've identified in your configuration file, you can use the nDisplayLauncher application to start the Project on all computers simultaneously. You should only run this on your master machine, or a console machine (it doesn’t have to be a machine with the unreal project on, it just needs to be on the same subnet. )

...