
I tried to upload a youtube video but it pretty much looks like crap. Maybe you can get a better sense for what this is by looking here.
http://www.youtube.com/watch?v=GiT7XSKwxOs
In the video the camera starts off as a normal FPS camera. At 0:21 I switch the parent node of the camera to the rotating set of axes. Now the camera acts like that node is the root node. This may be useful for having a character that moves around on a moving platform, and it doesn't make sense to have that platform attached to the root of the scene-graph.
I'll post the code in a reply to this initial post to make things a little more managable. CRelativeCameraSceneNode extends CCameraSceneNode and adds two members: m_localTarget and m_localUp. The OnAnimate() method uses these to set the true Target and Up vector, after transforming the local target and up vector into it's parent node's reference frame.
The modified CSceneNodeAnimatorCameraFPS assumes small angles of rotation. Rather than rotating the target vector specifically, I add to the target vector in the direction of the up vector for virtical tilt, and I add to the target vector in the direction orthogonal to both the target vector and the up vector for horizontal movement. Then I normalize the new target vector and scale it to match the original magnitude (just in case I ever want to use that for something, though for my purpose I could probably just leave it normalized).
