Circus

Circus is a jMonkeyEngine based cluster-solution for multi-screen VR-systems. I started making it to be able to use the jMonkeyEngine API (JME) with the VR-cave for our Mars Development projects in the Reality Lab at the Lund University.

The cave
The cave has 4 projector-pairs, each capable of presenting a stereoscopic image through polarization-filtering. They are setup as a room with three walls and a floor. The walls are back-projections and the floor projectors are installed in the above with a mirror reflecting the light onto the floor. The job of rendering the content for all 8 projectors is currently done by a single PC with four graphics cards on an extended pci-express bus.

Circus
In the Circus system several computers will share the workload. Each projector-pair will have its own computer to take care of its own rendering and there will be one master-computer that will send events to those.

The system includes these three parts:

  • Cave application
  • Circus
  • CircusMonkey

The Cave application is the JME game, visualization or other type of real time 3D-application we want to run in the cave. Ultimately it could be any JME application.

Circus is running parallell with the Cave application on the master computer. It is, through AspectJ, able to listen for relevant changes in the Cave application and send events to the CircusMonkeys over the LAN.

CircusMonkey is running on the computers who are responsible for rendering for each their projector-pair. It is a very simple stereo-enabled JME application whose tasks are to render whatever is in its scene graph, receive events from Circus and accordingly update the camera and the contents of its scene graph.

When a child is attached to the scene graph in the Cave application, Circus hears about it and that child is referenced in a new ChildAttachedEvent, which is serialized and sent to all CircusMonkeys. The CircusMonkeys de-serializes the ChildAttachedEvent, gets the child and attaches it to it's scene graph (in the right place in the hierarchy).

Circus is currently capable of creating the following events:

  • ChildAttachedEvent
  • LocalRotationSetEvent
  • LocalTranslationSetEvent
  • RenderStateSetEvent
  • TextureAddedToCacheEvent
  • VertexBufferSetEvent
  • CameraUpdatedEvent
  • ApplicationClosedEvent