This topic is now archived and is closed to further replies.

Converting from Quaternion to DX LookAtLH

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

Partly D3D - but as this more of a maths problem thought better to post here. I have my world objects and my camera stored in the same base class. So they each share lots of properties. Notably a world position and a quaternion specifying their rotation. For normal objects this is great, the position vector + the rotation quaternion let me create a world Transform matrix. The bit I''m getting confused by is the camera part. It needs to construct a view matrix. What I have at the moment (for hack purposes) is: Matrix.LookAtLH(new Vector3(_xPos,_yPos,_zPos), _lookAt, new Vector3(0f,1f,0f)); Where _xPos etc specify the world position, but I need a way to generate the _lookAt and Up vectors from the position+rotation I have stored. Any suggestions?

Share this post

Link to post
Share on other sites
For a regular object, you get the orientation matrix by converting the quaternion
q = q_yaw * q_pitch * q_roll
to a matrix. To do the same thing with a camera, you have to do the inverse transformation, which can be done either by finding the inverse of that matrix, or by calculating the matrix of
q = q_(-roll) * q_(-pitch) * q_(-yaw)

In case you don''t know, the matrix associated with the quaternion q = (n, x, y, z) is

n^2 + x^2 - y^2 - z^2 2xy - 2zn 2xz + 2yn
2xy + 2zn n^2 - x^2 + y^2 - z^2 2yz - 2xn
2zx - 2yn 2zy + 2xn n^2 - x^2 - y^2 + z^2

Share this post

Link to post
Share on other sites
D3DMATRIX camTransform;
D3DMATRIX camViewTransform;

// Obtain camera transform from a quaternion.

D3DXMatrixRotationQuaternion( &camTransform, &camOrienationQuat );

// Build camera "view" transform.

D3DVECTOR* camTransformYAxis = ( D3DVECTOR* )( &camTransform.m[1][0] );
D3DVECTOR* camTransformZAxis = ( D3DVECTOR* )( &camTransform.m[2][0] );

D3DXMatrixLookAtLH( &camViewTransform, &camPos, &( camPos + camTransformZAxis ), &camTransformYAxis );

Share this post

Link to post
Share on other sites
Darn - nearly there (thanks both of you) ..... just one catch - I''m doing this in C#, and there is no damned documentation for DX....

>>D3DVECTOR* camTransformYAxis = ( D3DVECTOR* )( &camTransform.m[1][0] );
>>D3DVECTOR* camTransformZAxis = ( D3DVECTOR* )( &camTransform.m[2][0] );

As we don''t have pointers into the Matrix structure in C#, which elements of the matrix are needed.... (M21, M22, M23 and M31, M32, M33 I''m guessing?)

Share this post

Link to post
Share on other sites
obviously i have no idea what i''m doing.
but it''s been known for rambling to start bright ideas...
anyway i guess you couldn''t pass those pointers as references in C# huh?

Share this post

Link to post
Share on other sites
Thanks all - for future reference... here''s the C# solution....

Firstly, Meduzza''s code was damned near there, but the order of the camTransformYAxis/camTransformZAxis generation was different to the order in LookATLH - so my first mistake was getting these reversed (DOH!)... yes.. M21, M22, M23 and M31, M32, M33 are the correct elements.

Secondly, Meduzza''s solution provided a rear view camera - so I had to reverse them - prviously this wasn''t easy (which was where my problem was comming from), but now the vectors had been obtained it was simple. Thanks Aprosenf for the -(x) suggestion.

// Horribly unoptimised....

// _matrixRotation is a rotation matrix

// _quatRotation is a stored rotation quaternion

// _xPos, _yPos, zPos - the position of the camera

Vector3 camPos = new Vector3(_xPos,_yPos,_zPos);
Vector3 camTY = new Vector3(_matrixRotation.M21,_matrixRotation.M22,_matrixRotation.M23);
Vector3 camTZ = new Vector3(-(_matrixRotation.M31),-(_matrixRotation.M32),-(_matrixRotation.M33));
return Matrix.LookAtLH(camPos, camPos + camTZ, camTY);

Share this post

Link to post
Share on other sites