Code:
#pragma once
#include "d3dx9.h"
//Implements a 3D orientation class for all object
//This class controls all vectors for the object
//It currently uses euler angles
//This class is very similar to a camera class, but it does not
//compute view matrices
enum OBJECT_TYPE
{
OBJECT_AIR,
OBJECT_GND
};
class COrient3D
{
protected:
D3DXVECTOR3 m_vecUp;
D3DXVECTOR3 m_vecRight;
D3DXVECTOR3 m_vecLook;
D3DXVECTOR3 m_vecPos;
OBJECT_TYPE m_iObjType;
float m_fRoll;
float m_fYaw;
float m_fPitch;
float m_fAzimuth;
float m_fElevation;
public:
COrient3D(void);
void GetLook(D3DXVECTOR3 *out_vecLook) {*out_vecLook=m_vecLook;}
void GetRight(D3DXVECTOR3 *out_vecRight) {*out_vecRight=m_vecRight;}
void GetUp(D3DXVECTOR3 *out_vecUp) {*out_vecUp=m_vecUp;}
void GetPosition(D3DXVECTOR3 *out_vecPos) {*out_vecPos=m_vecPos;}
void GetViewMatrix(D3DXMATRIX *outMatrix);
void GetViewMatrixAzEl(D3DXMATRIX *outMatrix);
float GetPitch() {return D3DX_PI-m_fPitch;}
float GetYaw() {return D3DX_PI-m_fYaw;}
float GetRoll() {return D3DX_PI-m_fRoll;}
float GetAzimuth() {return m_fAzimuth;}
float GetElevation() {return m_fElevation;}
D3DXVECTOR3 GetLook() {return m_vecLook;}
D3DXVECTOR3 GetRight() {return m_vecRight;}
D3DXVECTOR3 GetUp() {return m_vecUp;}
D3DXVECTOR3 GetPosition() {return m_vecPos;}
//Movement about the axes given current roll, pitch and yaw
void Fly(float fUnits);
void Strafe(float fUnits);
void Walk(float fUnits);
//Orientation
void Roll(float fAngle);
void Pitch(float fAngle);
void Yaw(float fAngle);
void MakeOrtho(void);
void AdjustRoll(float fAngle)
{
m_fRoll+=fAngle;
//if (m_fRoll>D3DX_PI) m_fRoll-=D3DX_PI;
//if (m_fRoll<=0) m_fRoll+=D3DX_PI;
}
void AdjustPitch(float fAngle)
{
m_fPitch+=fAngle;
//if (m_fPitch>D3DX_PI*2.0f) m_fPitch-=D3DX_PI*2.0f;
//if (m_fPitch<0) m_fPitch+=D3DX_PI*2.0f;
//if (m_fYaw>D3DX_PI) m_fPitch=D3DX_PI-m_fPitch;
}
void AdjustYaw(float fAngle)
{
m_fYaw+=fAngle;
//if (m_fYaw>D3DX_PI*2.0f) m_fYaw-=D3DX_PI*2.0f;
//if (m_fYaw<0) m_fYaw+=D3DX_PI*2.0f;
}
void SetOrientation(float fRoll,float fPitch,float fYaw)
{
AdjustRoll(fRoll);
AdjustPitch(fPitch);
AdjustYaw(fYaw);
}
void Reset(void)
{
m_vecRight=D3DXVECTOR3(1.0f,0.0f,0.0f);
m_vecUp=D3DXVECTOR3(0.0f,1.0f,0.0f);
m_vecLook=D3DXVECTOR3(0.0f,0.0f,1.0f);
}
void SetPosition(D3DXVECTOR3 vecPos) {m_vecPos=vecPos;}
void SetPosition(float x,float y,float z) {m_vecPos=D3DXVECTOR3(x,y,z);}
OBJECT_TYPE GetObjectType() {return m_iObjType;}
void SetObjectType(OBJECT_TYPE iNewType)
{
if (iNewType==OBJECT_AIR || iNewType==OBJECT_GND)
{
m_iObjType=iNewType;
return;
} else m_iObjType=OBJECT_AIR;
return;
}
};
Code:
COrient3D::COrient3D()
{
m_vecRight=D3DXVECTOR3(1.0f,0.0f,0.0f);
m_vecUp=D3DXVECTOR3(0.0f,1.0f,0.0f);
m_vecLook=D3DXVECTOR3(0.0f,0.0f,1.0f);
m_vecPos=D3DXVECTOR3(0.0f,0.0f,0.0f);
m_iObjType=OBJECT_AIR;
m_fYaw=0.0f;
m_fRoll=0.0f;
m_fPitch=0.0f;
m_fAzimuth=0.0f;
m_fElevation=0.0f;
}
void COrient3D::Fly(float fUnits)
{
if (m_iObjType==OBJECT_AIR)
m_vecPos+=m_vecUp*fUnits;
}
void COrient3D::Strafe(float fUnits)
{
if (m_iObjType==OBJECT_GND)
m_vecPos+=D3DXVECTOR3(m_vecRight.x,0.0f,m_vecRight.z)*fUnits;
if (m_iObjType==OBJECT_AIR)
m_vecPos+=m_vecRight*fUnits;
}
void COrient3D::Walk(float fUnits)
{
if (m_iObjType==OBJECT_GND)
m_vecPos+=D3DXVECTOR3(m_vecLook.x,0.0f,m_vecLook.z)*fUnits;
if (m_iObjType==OBJECT_AIR)
m_vecPos+=m_vecLook*fUnits;
}
void COrient3D::Roll(float fAngle)
{
m_fRoll+=fAngle;
if (m_fRoll>(D3DX_PI*2.0f)) m_fRoll-=(D3DX_PI*2.0f);
if (m_fRoll<0.0f) m_fRoll+=(D3DX_PI*2.0f);
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T,&m_vecLook,fAngle);
D3DXVec3TransformCoord(&m_vecRight,&m_vecRight,&T);
D3DXVec3TransformCoord(&m_vecUp,&m_vecUp,&T);
}
void COrient3D::Pitch(float fAngle)
{
m_fPitch+=fAngle;
if (m_fPitch>(D3DX_PI*2.0f)) m_fPitch-=(D3DX_PI*2.0f);
if (m_fPitch<0.0f) m_fPitch+=(D3DX_PI*2.0f);
D3DXMATRIX T;
D3DXMatrixRotationAxis(&T,&m_vecRight,fAngle);
D3DXVec3TransformCoord(&m_vecUp,&m_vecUp,&T);
D3DXVec3TransformCoord(&m_vecLook,&m_vecLook,&T);
}
void COrient3D::Yaw(float fAngle)
{
m_fYaw+=fAngle;
if (m_fYaw>(D3DX_PI*2.0f)) m_fYaw-=(D3DX_PI*2.0f);
if (m_fYaw<0.0f) m_fYaw+=(D3DX_PI*2.0f);
D3DXMATRIX T;
if (m_iObjType==OBJECT_GND) D3DXMatrixRotationY(&T,fAngle);
if (m_iObjType==OBJECT_AIR) D3DXMatrixRotationAxis(&T,&m_vecUp,fAngle);
D3DXVec3TransformCoord(&m_vecRight,&m_vecRight,&T);
D3DXVec3TransformCoord(&m_vecLook,&m_vecLook,&T);
}
void COrient3D::MakeOrtho(void)
{
D3DXVec3Normalize(&m_vecLook,&m_vecLook);
D3DXVec3Cross(&m_vecUp,&m_vecLook,&m_vecRight);
D3DXVec3Normalize(&m_vecRight,&m_vecRight);
D3DXVec3Cross(&m_vecRight,&m_vecUp,&m_vecLook);
D3DXVec3Normalize(&m_vecLook,&m_vecLook);
}
void COrient3D::GetViewMatrix(D3DXMATRIX *outMatrix)
{
D3DXVec3Normalize(&m_vecLook,&m_vecLook);
D3DXVec3Cross(&m_vecUp,&m_vecLook,&m_vecRight);
D3DXVec3Normalize(&m_vecUp,&m_vecUp);
D3DXVec3Cross(&m_vecRight,&m_vecUp,&m_vecLook);
D3DXVec3Normalize(&m_vecRight,&m_vecRight);
(*outMatrix)(0,0)=m_vecRight.x;
(*outMatrix)(0,1)=m_vecRight.y;
(*outMatrix)(0,2)=m_vecRight.z;
(*outMatrix)(0,3)=0.0f;
(*outMatrix)(1,0)=m_vecUp.x;
(*outMatrix)(1,1)=m_vecUp.y;
(*outMatrix)(1,2)=m_vecUp.z;
(*outMatrix)(1,3)=0.0f;
(*outMatrix)(2,0)=m_vecLook.x;
(*outMatrix)(2,1)=m_vecLook.y;
(*outMatrix)(2,2)=m_vecLook.z;
(*outMatrix)(2,3)=0.0f;
(*outMatrix)(3,0)=0.0f;
(*outMatrix)(3,1)=0.0f;
(*outMatrix)(3,2)=0.0f;
(*outMatrix)(3,3)=1.0f;
}
void COrient3D::GetViewMatrixAzEl(D3DXMATRIX *outMatrix)
{
D3DXVec3Normalize(&m_vecLook,&m_vecLook);
D3DXVec3Cross(&m_vecUp,&m_vecLook,&m_vecRight);
D3DXVec3Normalize(&m_vecRight,&m_vecRight);
D3DXVec3Cross(&m_vecRight,&m_vecUp,&m_vecLook);
D3DXVec3Normalize(&m_vecLook,&m_vecLook);
D3DXVECTOR3 vecPos=m_vecPos;
(*outMatrix)(0,0)=m_vecRight.x;
(*outMatrix)(0,1)=m_vecUp.x;
(*outMatrix)(0,2)=sinf(m_fElevation)*cosf(m_fAzimuth);
(*outMatrix)(0,3)=0.0f;
(*outMatrix)(1,0)=m_vecRight.y;
(*outMatrix)(1,1)=m_vecUp.y;
(*outMatrix)(1,2)=sinf(m_fElevation)*sinf(m_fAzimuth);;
(*outMatrix)(1,3)=0.0f;
(*outMatrix)(2,0)=m_vecRight.z;
(*outMatrix)(2,1)=m_vecUp.z;
(*outMatrix)(2,2)=cosf(m_fElevation);
(*outMatrix)(2,3)=0.0f;
(*outMatrix)(3,0)=vecPos.x;
(*outMatrix)(3,1)=vecPos.y;
(*outMatrix)(3,2)=vecPos.z;
(*outMatrix)(3,3)=1.0f;
}