Jump to content
• Advertisement

# Creating/Using Projection Matrix

This topic is 3178 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

## Recommended Posts

I am working on a software renderer (for fun and learning). Currently I am handling the projection of my vertices by doing; float inv = (120.0f / v->coordsWorld.z); v->scr[0] = v->coordsWorld.x * inv + (resX >> 1); v->scr[1] = -v->coordsWorld.y * inv + (resY >> 1); but I would like to handle this the same way one would in DirectX (creating a WorldViewProjection matrix). I've implemented a nice little Matrix4x4 class which I am using to apply world transformation to my object(s). I believe that my ViewMatrix will simply be a matrix which has the translation and rotations of the camera (no special work required here). However I am a little bit stuck on creating my projection matrix (instead of using the above code). Here is what I've got so far; void CreateProjectionMatrix(float fov, float aspect, float zn, float zf, Mat4x4 &mat) { float h = cot(fov / 2.0f); float w = h / aspect; mat.m[0][0] = w; mat.m[1][1] = h; mat.m[2][2] = zf / ( zn - zf); mat.m[2][3] = -zn * zf / ( zn - zf ); mat.m[3][2] = 1; } I've based this of the example of the Left Handed CreateProjection function explained in the DirectX sdk. Once I've got all these matrices I am attempting to use them doing something like; vert *= worldMatrix; vert *= viewMatrix; vert *= projectionMatrix; vert.screenXPos = vert.worldPosition.x; vert.screenYPos = vert.worldPosition.y; I believe I have the general concept here correct - but when I use my new matrix based method instead of my simple projection method I just get a blank screen (as opposed to the correct result I was getting before). Anyone see the problem in my approach?

#### Share this post

##### Share on other sites
Advertisement
Are you sure that your view matrix is right. Remember that you are transforming the vertices, not the camera. So if you want the camera to move forward 5 spaces, you must move all vertices backwards 5 spaces.

#### Share this post

##### Share on other sites
You make a good point (and Im definitely going to have to take it into consideration once I try and move the camera) but Ive actually got the view matrix set to be an identity matrix right now.

#### Share this post

##### Share on other sites
That isn't enough. Try manually multiplying that matrix with vertices with different Z. You still have to do the division. See here: The Direct3D Transformation Pipeline.

#### Share this post

##### Share on other sites
I've read through the suggested document now and it seems like the steps in the DirectX transformation pipeline are:

World -> View -> Projection -> Clipping (Optional, Im skipping this for now) -> Viewport Scale Matrix -> Divide by W

Using my old method I've verified my World matrix is OK. I've set my view matrix to identity for now. To create my Projection Matrix I am using the function:

Mat4x4 CreateProjectionMatrix(float fov, float aspect, float zn, float zf){		Mat4x4 rMat;		rMat.set(0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f);		float h = 1.0f / tan(fov / 2.0f);	float w = h / aspect;		rMat.m[0][0] = w;	rMat.m[1][1] = h;	rMat.m[2][2] = zf / ( zf - zn );	rMat.m[2][3] = -zf * zn / ( zf - zn );	rMat.m[3][2] = 1;		return rMat;}

Then to create my Viewport Scale Matrix I am doing:

Mat4x4 CreateViewportScaleMatrix(int w, int h, float x, float y, float cw, float ch){	Mat4x4 rMat;	rMat.set(0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f,    0.0f, 0.0f, 0.0f, 0.0f);	rMat.m[0][0] = w;	rMat.m[1][1] = -h;	rMat.m[3][0] = x;	rMat.m[3][1] = h + y; 	return rMat;}

To get my W value (this is the depth correct?):

float w = len(v.coordsWorld); // This assumes my camera is at the origin

I'm still not getting the correct values however. I tried checking the matrix DirectX makes doing the same projection call and I am now producing the same values;

0.434 0 0 0
0 0.577 0 0 0
0 0 1 -1
0 0 1 0

This makes me thing my viewport matrix or W value is wrong.

Is there some part I am still mixing up here?

#### Share this post

##### Share on other sites

• Advertisement
• Advertisement

• ### Popular Contributors

1. 1
2. 2
3. 3
Rutin
19
4. 4
5. 5
• Advertisement

• 14
• 30
• 13
• 11
• 11
• ### Forum Statistics

• Total Topics
631780
• Total Posts
3002314
×

## Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!