Rotating view with direct 3d
I working on rotating my view (camera source).I found many example on rotating object but couldnt find any on cameras.
Remembering stuff my linear algebra class Here is the code I cam up with.
D3DXMATRIX matRotation;
D3DXVECTOR3 vecToOrign;
D3DXVECTOR3 vecRotatedToOrigin;
if (rotateX !=0.0f || rotateY !=0.0f)
{
D3DXVec3Subtract( &vecToOrign, &vecCameraSource, &vecCameraTarget); //move point back to origin
if (rotateX !=0.0f)
{
D3DXMatrixRotationX(&matRotation, rotateX/RADIAN_TO_DEGREES); //calculate rotation on X
D3DXVec3TransformNormal(&vecRotatedToOrigin,&vecToOrign,&matRotation); //apply rotation
}
if (rotateY !=0.0f)
{
D3DXMatrixRotationY(&matRotation, rotateX/RADIAN_TO_DEGREES); //calculate rotation on Y
D3DXVec3TransformNormal(&vecRotatedToOrigin,&vecToOrign,&matRotation); //apply rotation
}
D3DXVec3Add( &vecCameraSource, &vecRotatedToOrigin, &vecCameraTarget); //move point back
}
Is this right or did I sleep too much in class? Is there a better way?
Thanks,
Michael
There is no difference rotation cameras or object. Should work exactly the same. They are both matrix.
void BX_GRAPHICS_CAMERA::Rotate(char axis, float amount){ D3DXMATRIX tempMatrix; switch(axis) { case ''x'': case ''X'': D3DXMatrixRotationX(&tempMatrix, amount); break; case ''y'': case ''Y'': D3DXMatrixRotationY(&tempMatrix, amount); break; case ''z'': case ''Z'': D3DXMatrixRotationZ(&tempMatrix, amount); break; } D3DXMatrixMultiply(&p_CameraMatrix, &p_CameraMatrix, &tempMatrix);}
So doing this will keep my camera target the same? I dont want to rotate the world view I want to rotate around my target.
Then you might find D3DXMatrixLookAtLH useful. Use whatever for the camera position and this will ensure that you''re looking at the target.
To rotate around the object, just reverse the last 2 parameters around the MatrixMultiply in the example I showed before (or look below)
You will probably need to set the world matrix to where the object is (or place the object at 0,0,0) to make it work.
Every time I "orbit" is during a character select screen (pick your model) and the model is always 0,0,0... And it works. I''ve not actually tried to orbit another object in another location. The code above might not work for that.
void BX_GRAPHICS_CAMERA::Orbit(char axis, float amount){ D3DXMATRIX tempMatrix; switch(axis) { case ''x'': case ''X'': D3DXMatrixRotationX(&tempMatrix, amount); break; case ''y'': case ''Y'': D3DXMatrixRotationY(&tempMatrix, amount); break; case ''z'': case ''Z'': D3DXMatrixRotationZ(&tempMatrix, amount); break; } D3DXMatrixMultiply(&p_CameraMatrix, &tempMatrix, &p_CameraMatrix);}
You will probably need to set the world matrix to where the object is (or place the object at 0,0,0) to make it work.
Every time I "orbit" is during a character select screen (pick your model) and the model is always 0,0,0... And it works. I''ve not actually tried to orbit another object in another location. The code above might not work for that.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement