Code:
class CCamera
{
D3DXVECTOR3 Look;
D3DXVECTOR3 Right;
D3DXVECTOR3 Up;
D3DXVECTOR3 Pos;
float m_fPitch,m_fRoll,m_fYaw;
....
public:
void Init();
void GetViewMatrix(D3DXMATRIX *outMatrix);
void Strafe(float units);
void Fly(float units);
void Walk(float units);
...
};
void CCamera::Init(void)
{
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);
m_fPitch=m_fRoll=m_fYaw=0.0f;
}
void CCamera::GetViewMatrix(D3DXMATRIX *outMatrix)
{
D3DXVec3Normalize(&Look,&Look);
D3DXVec3Cross(&Up,&Look,&Right);
D3DXVec3Normalize(&Right,&Right);
D3DXVec3Cross(&Right,&Up,&Look);
D3DXVec3Normalize(&Look,&Look);
float x=-D3DXVec3Dot(&Right,&Pos);
float y=-D3DXVec3Dot(&Up,&Pos);
float z=-D3DXVec3Dot(&Look,&Pos);
(*outMatrix)(0,0)=Right.x;
(*outMatrix)(0,1)=Up.x;
(*outMatrix)(0,2)=Look.x;
(*outMatrix)(0,3)=0.0f;
(*outMatrix)(1,0)=Right.y;
(*outMatrix)(1,1)=Up.y;
(*outMatrix)(1,2)=Look.y;
(*outMatrix)(1,3)=0.0f;
(*outMatrix)(2,0)=Right.z;
(*outMatrix)(2,1)=Up.z;
(*outMatrix)(2,2)=Look.z;
(*outMatrix)(2,3)=0.0f;
(*outMatrix)(3,0)=x;
(*outMatrix)(3,1)=y;
(*outMatrix)(3,2)=z;
(*outMatrix)(3,3)=1.0f;
}
void CCamera::Pitch(float angle)
{
m_fPitch+=angle;
if (m_fPitch>=(D3DX_PI*2)) m_fPitch=0.0f;
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T,&Right,angle);
D3DXVec3TransformCoord(&Up,&Up,&T);
D3DXVec3TransformCoord(&Look,&Look,&T);
}
void CCamera::Yaw(float angle)
{
m_fYaw+=angle;
if (m_fYaw>=(D3DX_PI*2.0f)) m_fYaw-=(D3DX_PI*2.0f);
D3DXMATRIX T;
if (CameraType==LANDOBJECT) D3DXMatrixRotationY(&T,angle);
if (CameraType==AIRCRAFT) D3DXMatrixRotationAxis(&T,&Up,angle);
D3DXVec3TransformCoord(&Right,&Right,&T);
D3DXVec3TransformCoord(&Look,&Look,&T);
}
void CCamera::Roll(float angle)
{
m_fRoll+=angle;
if (m_fRoll>=(D3DX_PI*2)) m_fRoll=0.0f;
if (CameraType==AIRCRAFT)
{
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T,&Look,angle);
D3DXVec3TransformCoord(&Right,&Right,&T);
D3DXVec3TransformCoord(&Up,&Up,&T);
}
}
That should give you enough to complete the class.