Camera

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值