Trying to reverse the Projection Matrix to Y being up.

Started by
2 comments, last by JohnnyCode 8 years ago

I'm trying out some direct3d stuff coming from opengl and I have a question regarding the projection matrix.

I would like the coordinate system to look like so


     y - 720
     ^
     |
     |
     |
     |
     |
     |
     |
     |
0, 0 ---------------------------------> x - 1280

Normally in opengl I would do something like this.


// other code....
glMatrixMode(GL_PROJECTION);
m4 Projection = Orthographic(0.0f, 1280.0f, 0.0f, 720.0f, 1.0f, -1.0f);
glLoadMatrixf(Projection.f);
// other code....

internal m4
Orthographic(f32 Left, f32 Right, f32 Bottom, f32 Top, f32 Near, f32 Far) {
    m4 Result = IdentityMatrix();

    Result.m0[0] = 2.0f / (Right  - Left);
    Result.m1[1] = 2.0f / (Top - Bottom);
    Result.m2[2] = -2.0f / (Far - Near);
    Result.m3[0] = -(Right + Left) / (Right - Left);
    Result.m3[1] = -(Top + Bottom) / (Top - Bottom);
    Result.m3[2] = -(Far + Near) / (Far - Near);

    return Result;
}

In direct3d I am doing something similar (or so I think)


D3DXMATRIX ProjectionMatrix;
// I know opengl is right handed so I make a right handed ortho right?
D3DXMatrixOrthoOffCenterRH(&ProjectionMatrix, 0.0f, Width, 0.0f, Height, 1.0f, -1.0f);
Direct3DDevice->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);

Problem is I don't see anything on the screen and cant seem to figure out how I oriented it.

Advertisement

Do you use view matrix with your orthogonal projection? It defines handedness much more, projection matrix does as much as invert the depth axis to conform into depth comparison (postive or negative) according to handedness of view matrix.

Do you use view matrix with your orthogonal projection? It defines handedness much more, projection matrix does as much as invert the depth axis to conform into depth comparison (postive or negative) according to handedness of view matrix.

I set the view and world matrix to an identity matrix.


D3DXMATRIX IdentityMatrix;
D3DXMatrixIdentity(&IdentityMatrix);
Direct3DDevice->SetTransform(D3DTS_WORLD, &IdentityMatrix);
Direct3DDevice->SetTransform(D3DTS_VIEW, &IdentityMatrix);

You do not orient it nor translate it, but if you will use both versions, LH and RH for projection, you should spot some object at some point, considering it is in scale of the orthogonal projection- width height top down world values.

This topic is closed to new replies.

Advertisement