Projection on a rotated screen

I am fighting since quite a while with the problem to get a proper projection to a rotated screen.
In a virtual reality studio there is a big screen which is rotated by 30°. The user is looking downwards to the screen. Anything projected to this screen should appear to be horizontal to the floor. For example: A cube’s top and bottom are viewed in stereo mode parallel to the floor.
I tried many ways, but none has worked so far:

  • simply rotating the whole scene
  • facing downwards
  • facing downwards in an asymmetric frustum
    I thought changing the projection matrix in a way that the perspective normalization does not happen with a vertical near plane but with a rotated one might be the solution. I haven’t programmed it yet but my calculations so far show that this does not seem to be the correct way.

So far I know the vertices above the center point are closer to the viewer than without screen rotation and the ones below the middle point are further and further away.

I have a program which does exactly this, but I don’t know how it does it. I just have something where I can check whether my solution is correct or not.

Does anybody has any ideas or even experiences with such a situation?

The view vector should be orthogonal to the screen. i.e. rotated down 30 degrees. Given this configuration the frustum may have to be asymmetric depending on the angles this creates.

Hmmm…
Do you mean looking downwards within the frustum by 30° (sketch)?
And the camera itself (lookAt()) as well?
This gives a similar, but not the correct result.

Indeed I had to transpose the objects into eye space and from there into screen space (rotating them by the inverse of the screen rotation). The eye space as well had to be rotated by the inverse of the screen rotation.
This position is then used to create the projection matrix.