# a camera problem in directx11

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

## 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 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.

Edited by Buckeye

##### 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

##### 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 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 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 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 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.

• ### Game Developer Survey

We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a \$15 incentive for your time and insights. Click here to start!

• 14
• 30
• 9
• 16
• 22