#pragma once
#include <d3d9.h>
#include <D3dx9core.h>
class CGameCamera
{
public:
CGameCamera(void);
~CGameCamera(void);
public:
//设置Camera向量
void SetCameraVector(D3DXVECTOR3 vecCamera);
//取得Camera向量
D3DXVECTOR3 GetCameraVector();
//设置Target向量
void SetTargetVector(D3DXVECTOR3 vecTarget);
//取得Target向量
D3DXVECTOR3 GetTargrtVector();
//沿Right轴移动
void MoveAlongRight(float fUnits);
//沿Up轴移动
void MoveAlongUp(float fUnits);
//沿Look轴移动
void MoveAlongLook(float fUnits);
//绕Right轴旋转
void RotateBendRight(float fAngle);
//绕Up轴旋转
void RotateBendUp(float fAngle);
//绕Look轴旋转
void RotateBendLook(float fAngle);
//取得取景矩阵
D3DMATRIX GetViewMatrix();
private:
D3DXVECTOR3 m_vecRight;
D3DXVECTOR3 m_vecUp;
D3DXVECTOR3 m_vecLook;
D3DXVECTOR3 m_vecCamera;
D3DXVECTOR3 m_vecTarget;
D3DMATRIX m_mxView;
};
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include "GameCamera.h"
/*
*功能 :构造函数
*参数 :void
*返回 :
*描述 :初始化Right, Up, Look, Camera, Target
*/
CGameCamera::CGameCamera(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);
m_vecCamera = D3DXVECTOR3(0.0f, 0.0f, -250.0f);
m_vecTarget = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
}
/*
*功能 :析构函数
*参数 :void
*返回 :
*描述 :
*/
CGameCamera::~CGameCamera(void)
{
}
/*
*功能 :设置Camera位置
*参数 :D3DXVECTOR3
*返回 :void
*描述 :设置Camera位置,并规范化Right, Up, Look
*/
void CGameCamera::SetCameraVector( D3DXVECTOR3 vecCamera )
{
m_vecCamera = vecCamera;
m_vecLook = m_vecTarget - m_vecCamera;
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);
}
/*
*功能 :取得Camera位置
*参数 :void
*返回 :D3DXVECTOR3
*描述 :
*/
D3DXVECTOR3 CGameCamera::GetCameraVector()
{
return m_vecCamera;
}
/*
*功能 :设置Target位置
*参数 :D3DXVECTOR3
*返回 :void
*描述 :设置Target位置,并规范化Right, Up, Look
*/
void CGameCamera::SetTargetVector( D3DXVECTOR3 vecTarget )
{
m_vecTarget = vecTarget;
m_vecLook = m_vecTarget - m_vecCamera;
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);
}
/*
*功能 :取得Target位置
*参数 :void
*返回 :D3DXVECTOR3
*描述 :
*/
D3DXVECTOR3 CGameCamera::GetTargrtVector()
{
return m_vecTarget;
}
/*
*功能 :沿Right方向平移fUnits个单位
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::MoveAlongRight( float fUnits )
{
m_vecCamera += m_vecRight * fUnits;
m_vecTarget += m_vecRight * fUnits;
}
/*
*功能 :沿Up方向平移fUnits个单位
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::MoveAlongUp( float fUnits )
{
m_vecCamera += m_vecUp * fUnits;
m_vecTarget += m_vecUp * fUnits;
}
/*
*功能 :沿Look方向平移fUnits个单位
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::MoveAlongLook( float fUnits )
{
m_vecCamera += m_vecLook * fUnits;
m_vecTarget += m_vecLook * fUnits;
}
/*
*功能 :沿Right方向旋转fangle度
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::RotateBendRight( float fAngle )
{
D3DXMATRIX mxRight;
D3DXMatrixRotationAxis(&mxRight, &m_vecRight, fAngle);
D3DXVec3TransformCoord(&m_vecLook, &m_vecLook, &mxRight);
D3DXVec3TransformCoord(&m_vecUp, &m_vecUp, &mxRight);
}
/*
*功能 :沿Up方向旋转fangle度
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::RotateBendUp( float fAngle )
{
D3DXMATRIX mxUp;
D3DXMatrixRotationAxis(&mxUp, &m_vecUp, fAngle);
D3DXVec3TransformCoord(&m_vecLook, &m_vecLook, &mxUp);
D3DXVec3TransformCoord(&m_vecRight, &m_vecRight, &mxUp);
}
/*
*功能 :沿Look方向旋转fangle度
*参数 :float
*返回 :void
*描述 :
*/
void CGameCamera::RotateBendLook( float fAngle )
{
D3DXMATRIX mxLook;
D3DXMatrixRotationAxis(&mxLook, &m_vecLook, fAngle);
D3DXVec3TransformCoord(&m_vecRight, &m_vecRight, &mxLook);
D3DXVec3TransformCoord(&m_vecUp, &m_vecUp, &mxLook);
}
/*
*功能 :计算取景变换矩阵
*参数 :void
*返回 :D3DMATRIX
*描述 :
*/
D3DMATRIX CGameCamera::GetViewMatrix()
{
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);
D3DXMATRIX viewMatrix;
viewMatrix._11 = m_vecRight.x;
viewMatrix._12 = m_vecUp.x;
viewMatrix._13 = m_vecLook.x;
viewMatrix._14 = 0.0f;
viewMatrix._21 = m_vecRight.y;
viewMatrix._22 = m_vecUp.y;
viewMatrix._23 = m_vecLook.y;
viewMatrix._24 = 0.0f;
viewMatrix._31 = m_vecRight.z;
viewMatrix._32 = m_vecUp.z;
viewMatrix._33 = m_vecLook.z;
viewMatrix._34 = 0.0f;
viewMatrix._41 = -D3DXVec3Dot(&m_vecRight, &m_vecCamera);
viewMatrix._42 = -D3DXVec3Dot(&m_vecUp, &m_vecCamera);
viewMatrix._43 = -D3DXVec3Dot(&m_vecLook, &m_vecCamera);
viewMatrix._44 = 1.0f;
return viewMatrix;
}