⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zcamera.h

📁 选自《3D游戏编程》第5章 实战例题:3D编程技术的实战例题
💻 H
字号:
#ifndef _ZCAMERA_H_
#define _ZCAMERA_H_

#include <d3d9.h>
#include <d3dx9.h>

/**
 * @brief 简单的摄像机操作类
 * @author 金智汉
 * @todo 没有对上方90度或下方90度进行检验,从数值上来看是不稳定的.
 */
class ZCamera
{
	D3DXVECTOR3		m_vEye;			/// 摄像机的当前位置
	D3DXVECTOR3		m_vLookat;		/// 摄像机的视线位置
	D3DXVECTOR3		m_vUp;			/// 摄像机的上方向量

	D3DXVECTOR3		m_vView;		/// 摄像机指向的单位方向向量
	D3DXVECTOR3		m_vCross;		/// 摄像机的侧面向量 cross(view,up)

	D3DXMATRIXA16	m_matView;		/// 摄像机矩阵
	D3DXMATRIXA16	m_matBill;		/// 广告牌矩阵(摄像机的逆矩阵)
public:

	/// 创建者
	ZCamera();
	
	/// 得到摄像机矩阵.
	D3DXMATRIXA16*	GetViewMatrix() { return &m_matView; }
	
	/// 得到广告牌矩阵.
	D3DXMATRIXA16*	GetBillMatrix() { return &m_matBill; }

public:

	/// 设定创建摄像机矩阵的基本向量值.
	D3DXMATRIXA16*	SetView( D3DXVECTOR3* pvEye,D3DXVECTOR3* pvLookat,D3DXVECTOR3* pvUp);

	/// 设定摄像机的位置值.
	void			SetEye( D3DXVECTOR3* pv ) { m_vEye = *pv; }
	
	/// 得到摄像机的位置值.
	D3DXVECTOR3*	GetEye() { return &m_vEye; }
	
	/// 设定摄像机的视线值.
	void			SetLookat( D3DXVECTOR3* pv ) { m_vLookat = *pv; }

	/// 得到摄像机的视线值.
	D3DXVECTOR3*	GetLookat() { return &m_vLookat; }
	
	/// 设定摄像机的上方向量值.
	void			SetUp( D3DXVECTOR3* pv ) { m_vUp = *pv; }
	
	/// 得到摄像机的上方向量值.
	D3DXVECTOR3*	GetUp() { return &m_vUp; }
	
	/// 更新值.
	void			Flush() { SetView( &m_vEye, &m_vLookat, &m_vUp ); }

	/// 以摄像机坐标系的X轴为轴旋转angle.
	D3DXMATRIXA16*	RotateLocalX( float angle );
	
	/// 以摄像机坐标系的Y轴为轴旋转angle.
	D3DXMATRIXA16*	RotateLocalY( float angle );

//	D3DXMATRIXA16*	RotateLocalZ( float angle );

	/// 移动到世界坐标系的 *pv值的位置.
	D3DXMATRIXA16*	MoveTo( D3DXVECTOR3* pv );
	
	/// 朝着摄像机坐标系X轴方向前进dist(后退时为-dist)
	D3DXMATRIXA16*	MoveLocalX( float dist );

	/// 朝着摄像机坐标系Y轴方向前进dist(后退时为-dist)
	D3DXMATRIXA16*	MoveLocalY( float dist );

	/// 朝着摄像机坐标系Z轴方向前进dist(后退时为-dist)
	D3DXMATRIXA16*	MoveLocalZ( float dist );
};

#endif // _ZCAMERA_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -