While we haven’t done any projection environment work here, most of the hooks that you’d need should be available to do this kind of work.
-
Active stereoscopic rendering
We only support side-by-side at the moment, but you’d be able to potentially expand our stereo rendering code to do it without too much effort. Take a look at FFakeStereoRenderingDevice in UnrealEngine.cpp to see a minimal implementation of a stereo device in the engine. If you expand upon that, you should be able to do interlacing by doing nothing in the AdjustViewRect function (to keep things full screen), and then calculating the StereoViewOffset every other frame. The interface might be slightly cleaner if you extended it to have another EStereoscopicPass for interlacing. -
Multiple display surfaces
Depending on how your video setup handles this, it could be easy or difficultIf the system works by slicing the same buffer, you could look at how we do AdjustViewRect to see how to render to different areas of one render target. If you require different outputs (multiple computers), you might have to get creative with using multiple clients connected to a server, or setting up multiple viewports.
-
User head and hand tracking
Head tracking is already built in to our HMD templates, so that should be pretty easy to figure out. Hand tracking isn’t something we’ve done much of internally. Our input devices support arbitrary axes binding, so I’d recommend hooking it up through that system, so that you can use all of our internal input system directly. -
Asymmetric camera projection
We have done a bit of this, all going through the same IStereoRendering interface, and then modifying the GetStereoProjectionMatrix() to return an asymmetric projection. -
Multi-host cluster
Again, you probably want to do something where you set up one server, and then the other clients join in to that server, but everyone targets the same player pawn. You can have as many cameras as you want on a pawn, so you can make each client select the one appropriate for their view position. All the same stereo rendering functions will apply, no matter camera you’re using. Check out APlayerCameraManager::SetViewTarget for a good place to start!
Hope that helps!