Full dome projection using three projectors

Written by Paul Bourke
July 2005

Input fisheye image

The input to a full dome projection is normally a fisheye image, more precisely an equal angle fisheye (equally spaced lines of latitude). Such fisheye images may make up the frames of a full dome movie or be created in realtime using OpenGL.


Projector frustums

Green lines show the projector frustum, in this case a 0.8:1 throw projector with a 4:3 aspect ratio. The yellow curve on the dome is the intersection of the frustum with the dome, ie: the part of the dome illuminated by a projector. In order for the dome to be completely covered the projectors are mounted slightly below and back from the rim of the dome, of course this longer throw can also be achieved with a mirror.

1 projector and frustum plane

2 projectors, showing overlap

3 projectors, top view

Edge blended images for each projector

The following three images are what is projected by each of the three projectors in order to achieve a total seamless coverage of the dome surface. Each projector is responsible for a 120 degree wedge of the dome surface, the edge blending is applied across the edges of each wedge. While not obvious in these images, the zone at the top of the dome has an edge blend across three images rather than just two.


Projector 1

Projector 2

Projector 3

OpenGL texture meshes for each projector

The warping and edge blending is achieved in real time by using a textured mesh in OpenGL. Similarly an offline warping can be applied to movie style content that creates a higher quality antialiased result, at the sacrifice of being able to readily change the projector alignment and edge blending. Each node of the mesh is described by a position (x,y), texture coordinate (u,v), and gamma corrected edge blend factors (r,g,b). The red zones is where edge blending factors are unity, the blue regions where they are zero, and the blending between those. The fisheye image is applied as a texture to this mesh.


Projector 1

Projector 2

Projector 3

Result on dome

While not particularly clear, the following shows the fisheye projected onto the dome. A correct undistorted view can only be achieved by actually being in the dome and standing in the center.

Projector 1

Projector 1 and 2

All projectors

Deriving warping mesh

There are at least two ways of creating the OpenGL warping mesh, one is to trace rays through a regular grid in the projection plane and determine where the ray strikes the dome and hence the texture coordinates in the fisheye texture. Another method, and the one used here, is to form a regular polar grid in fisheye space and determine the intersection on the projection plane of the vector to the corresponding position on the dome. Either of these would work but the later is more convenient when deriving the edge blending. The polar nature of the warping mesh can be seen in the images above that show the mesh.