Jump to content
  • Advertisement
Sign in to follow this  
johnnyBravo

In D3DXMATRIX structure, which part is xyz?

This topic is 4854 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

Hi in the D3DXMATRIX structure, I was wondering which part represents the xyz?
Quote:
typedef struct D3DXMATRIX { FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14, FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24, FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 ); } D3DXMATRIX;
thanks

Share this post


Link to post
Share on other sites
Advertisement
Normally,

X: _11, _12, _13
Y: _21, _22, _23
Z: _31, _32, _33
T: _41, _42, _42
0: _14, _24, _34
1: _44

"T" means translation.

BTW, OpenGL is the same.

Share this post


Link to post
Share on other sites
Quote:
Original post by johnnyBravo
hmm saying it was the view matrix, how would I get the position of the camera?

Thanks


You must invert the view matrix to get the position and orientation of the camera.

Share this post


Link to post
Share on other sites
ok well if you want to transform a matrix along the x, y, or z you would use ._41, ._42, ._43 respectively ... not sure what this other dude's talking about.

Share this post


Link to post
Share on other sites

The view matrix generated by D3DXMatrixLookAtLH is:

xaxis.x yaxis.x zaxis.x 0
xaxis.y yaxis.y zaxis.y 0
xaxis.z yaxis.z zaxis.z 0
-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1

where the eye vector represent the camera's position.

Considering that:

dot(V1,V2) = V1.x*V2.x + V1.y*V2.y + V1.z*V2.z

and

E11 E12 E13 E14
E21 E22 E23 E24
E31 E32 E33 E34
E41 E42 E43 E44

are the elements from a view matrix, based on the matrix generated by D3DXMatrixLookAtLH we can say:

E41 = -(E11*eye.x + E21*eye.y + E31*eye.z)
E42 = -(E12*eye.x + E22*eye.y + E32*eye.z)
E43 = -(E13*eye.x + E23*eye.y + E33*eye.z)

or in a matricial form:

E11 E12 E13
[eye.x, eye.y, eye.z] * E21 E22 E23 = -[E41, E42, E43]
E31 E32 E33

You must solve this system to find the camera's position (eye), that is:

eye * M = -V => eye = -V * inverse(M)

Since the camera coordinate system is an orthonormal entity:

inverse(M) = transpose(M)

So:

E11 E21 E31
[eye.x, eye.y, eye.z] = -[E41, E42, E43] * E12 E22 E32
E13 E23 E33


A simple way, as JohnBolton said, is inverting the view matrix. Why?... think a bit about that [wink].

Share this post


Link to post
Share on other sites
You guys are all backwards [smile]

You don't have a matrix for your camera's state? It has to be one of the most useful matrices. Why invert the view matrix to get the camera matrix? Why not invert a camera matrix to get the view matrix?

Then later you can use quaternions or such to change the camera matrix and your view matrix calculation always stays the same.

Share this post


Link to post
Share on other sites
Quote:
Original post by Jiia
Why invert the view matrix to get the camera matrix? Why not invert a camera matrix to get the view matrix?

Maybe we are using different names for the same thing [smile]. What did you mean with camera matrix? For me, the camera matrix and the view matrix are the same thing.
The view matrix is just a math resource that transforms vector coordinates from the world space to the view space. Inverting the view matrix will result a matrix that transforms vector coordinates from the view space to the world space.

Share this post


Link to post
Share on other sites
OK, clearing up the things:

The camera's eye position is expressed relative to the world coordinate system. Since it is the origin of the camera coordinate system, its coordinates are (0,0,0) when expressed relative to the camera coordinate system.

As I mentioned on my last post, by inverting the view matrix we can transform vector coordinates from the view space to the world space. So, we just need to transform the origin of the camera coordinate system to the world space, as shown below:

Eye = [0,0,0] * inverse(view matrix)


Using the Direct3D functions, we just need to do:

// supposing that you already created the view matrix
D3DXMatrixInverse( &matView, NULL, &matView );
D3DXVec3TransformCoord( &Eye, &D3DXVECTOR3(0.0f,0.0f,0.0f), &matView );

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

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!