a camera problem in directx11

Started by
6 comments, last by Buckeye 10 years ago

In directx11,a camera is identified with a position,a forcus direction,and a up direction.In my opinion?the up vector should be perpendicular to the forcus vertor.But in MS's toturial :

XMVECTOR Eye = XMVectorSet( 0.0f, 3.0f, -6.0f, 0.0f );
XMVECTOR At = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
g_View = XMMatrixLookAtLH( Eye, At, Up );
//cbNeverChanges.mView = XMMatrixTranspose( g_View );
As you can see, the At vec is same with the Up vec.I just confused with this usage.
By the way,what the reason to do the transpose after every XMMatricx**() be called.
Thanks for any help!
Advertisement

Can you link the tutorial, or, if it's in the SDK, post the name of the project?

XMMatrixLookAtLH builds a "left-handed" matrix - i.e., row-major. Transposing a matrix swaps the rows and columns, making it a column-major matrix. Apparently, the view matrix is used somewhere (looks like the shader) which needs a column-major matrix.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

A look at matrix is just what it says, it creates a matrix from a point to a target.

Not a direction, the direction of view is define by (using your variables) At - Eye

I think that is why you are getting confused.

You are correct that Up should be perpendicular to (At -Eye)

You have to view tutorials with a grain of salt, they are written by humans. Often they work even though they have bugs in them, it's only when you try to use the code in a different environment that the bugs become apparent.

The best tutorial writers allow feedback and are prepared to fix issues when they are pointed out to them. Microsoft..... not so much smile.png

In directx11,a camera is identified with a position,a forcus direction,and a up direction.In my opinion?the up vector should be perpendicular to the forcus vertor.But in MS's toturial :

XMVECTOR Eye = XMVectorSet( 0.0f, 3.0f, -6.0f, 0.0f );
XMVECTOR At = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
g_View = XMMatrixLookAtLH( Eye, At, Up );
//cbNeverChanges.mView = XMMatrixTranspose( g_View );
As you can see, the At vec is same with the Up vec.I just confused with this usage.
By the way,what the reason to do the transpose after every XMMatricx**() be called.
Thanks for any help!

You are correct that the look at vector and up vector should not be colinear. But the At vector is not the view direction, but the spot you are looking at.

1) As mentioned previously, the function XMMatrixLookAtLH will create a look vector using at-eye to get a vector from the eyepoint to the look at point.

2) The cross product between the view vector and the up vector give a vector perpendicular to the view and up vectors

3) The view vector is crossed with the perpendicular to give a new up vector that finalizes the orthonormal basis.

4) IIRC (can't remember from where) at one point the mul intrinsic in HLSL worked faster with column major layout than row major layout

Can you link the tutorial, or, if it's in the SDK, post the name of the project?

XMMatrixLookAtLH builds a "left-handed" matrix - i.e., row-major. Transposing a matrix swaps the rows and columns, making it a column-major matrix. Apparently, the view matrix is used somewhere (looks like the shader) which needs a column-major matrix.

it's in sdk.here the path:

Microsoft DirectX SDK (June 2010)\Samples\C++\Direct3D11\Tutorials\Tutorial07

Thanks for the path. I didn't notice the Up vector when I played with the file. In any case, if you take a look at how a view matrix is constructed, you can see that the Up vector is only used in a cross product with vector(At - Eye) to form a "to-the-right" vector. There are an infinite number of vectors perpendicular to a vector, so as long as the Up vector you use in view matrix construction is perpendicular to the desired "to-the-right" direction (edit: well, and not the same direction as At-Eye) and pointing in the general "up" direction* desired, the view matrices all come out identical.

*I say the general "up" direction because it's crossed with At-Eye. If the Up vector points "downward," the sign of the crossproduct changes and (you may have guessed) the scene will appear upside-down.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

Buck, I think the " "left-handed" matrix" bit from your previous reply should be removed, as handedness and majorness are different ideas altogether.

Nah, "left-hand" was specifically in quotation marks because the context was regarding a specific function advertised as "Look-At-Left-Hand," and I clearly stated the result was a row-major matrix.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

This topic is closed to new replies.

Advertisement