• Advertisement
Sign in to follow this  

a camera problem in directx11

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

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!

Share this post


Link to post
Share on other sites
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.

Edited by Buckeye

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Edited by Buckeye

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


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

  • Advertisement