Code:
#include "CCamera.h"
CCamera::CCamera()
{
Pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
Right = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
Up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
Look = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
}
void CCamera::GetPosition(D3DXVECTOR3* _pos)
{
*_pos =Pos;
}
void CCamera::SetPosition(D3DXVECTOR3* _pos)
{
Pos = *_pos;
}
void CCamera::GetRight(D3DXVECTOR3* _right)
{
*_right = Right;
}
void CCamera::GetUp(D3DXVECTOR3* _up)
{
*_up = Up;
}
void CCamera::GetLook(D3DXVECTOR3* _look)
{
*look = Look;
}
void CCamera::Walk(float _units)
{
// move only on xz plane for land object
//if( _cameraType == LANDOBJECT )
// Pos += D3DXVECTOR3(Look.x, 0.0f,Look.z) * _units;
//if( _cameraType == AIRCRAFT )
Pos +=Look * _units;
}
void CCamera::Strafe(float _units)
{
// move only on xz plane for land object
//if( _cameraType == LANDOBJECT )
//Pos += D3DXVECTOR3(Right.x, 0.0f, Right.z) * _units;
//if( _cameraType == AIRCRAFT )
Pos += Right * _units;
}
void CCamera::Fly(float _units)
{
//if( _cameraType == AIRCRAFT )
Pos += Up * _units;
}
void CCamera::Pitch(float _angle)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &Right, _angle);
// rotate _up and _look around _right vector
D3DXVec3TransformCoord(&Up,&Up, &T);
D3DXVec3TransformCoord(&Look,&Look, &T);
}
void CCamera::Yaw(float _angle)
{
D3DXMATRIX T;
// rotate around world y (0, 1, 0) always for land object
//if( _cameraType == LANDOBJECT )
//D3DXMatrixRotationY(&T, angle);
// rotate around own up vector for aircraft
if( _cameraType == AIRCRAFT )
D3DXMatrixRotationAxis(&T, &Up, _angle);
// rotate _right and _look around _up or y-axis
D3DXVec3TransformCoord(&Right,&Right, &T);
D3DXVec3TransformCoord(&Look,&Look, &T);
}
void CCamera::Roll(float _angle)
{
// only roll for aircraft type
//if( _cameraType == AIRCRAFT )
//{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T, &Look, _angle);
// rotate _up and _right around _look vector
D3DXVec3TransformCoord(&Right,&Right, &T);
D3DXVec3TransformCoord(&Up,&Up, &T);
//}
}
void CCamera::GetViewMatrix(D3DXMATRIX* _V)
{
// Keep camera's axes orthogonal to eachother
D3DXVec3Normalize(&Look, &Look);
D3DXVec3Cross(&Up, &Look, &Right);
D3DXVec3Normalize(&Up, &Up);
D3DXVec3Cross(&Right, &Up, &Look);
D3DXVec3Normalize(&Right, &Right);
// Build the view matrix:
float x = -D3DXVec3Dot(&Right, &Pos);
float y = -D3DXVec3Dot(&Up, &Pos);
float z = -D3DXVec3Dot(&Look, &Pos);
(*_V)(0,0) = Right.x; (*_V)(0, 1) = Up.x; (*_V)(0, 2) = Look.x; (*_V)(0, 3) = 0.0f;
(*_V)(1,0) = Right.y; (*_V)(1, 1) = Up.y; (*_V)(1, 2) = Look.y; (*_V)(1, 3) = 0.0f;
(*_V)(2,0) = Right.z; (*_V)(2, 1) = Up.z; (*_V)(2, 2) = Look.z; (*_V)(2, 3) = 0.0f;
(*_V)(3,0) = x; (*_V)(3, 1) = y; (*_V)(3, 2) = z; (*_V)(3, 3) = 1.0f;
}
That should do the trick. You should probably inline the smaller functions later.