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

📄 camera.h

📁 3D游戏展示程序
💻 H
字号:
//--------------------------------------------------
//  Desc: 摄像机
//  Date: 2006.12.27 /update
//  Author: artsylee
//
//  Copyright (C) 2006 artsylee
//
//--------------------------------------------------

#ifndef _CAMERA_
#define _CAMERA_

#include <d3dx9.h>
#include "GNode.h"

enum Camera_Type
{
	CT_MODELVIEW,	// 第三人称
	CT_FREEVIEW,	// 自由视角
	CT_FIRSTVIEW,	// 第一人称
	CT_INVALID,		// 无效
};

//---------------------------------------------------
// 第一人称摄像机
//---------------------------------------------------
class CCamera
{
public:
	CCamera();
	virtual ~CCamera();

	void MoveLR(float units);		// left/right
	void MoveUD(float units);		// up/down
	void MoveFB(float units);		// forward/backward

	virtual void RotateRight(float angle);	// rotate on right vector
	virtual void RotateUp(float angle);		// rotate on up vector
	virtual void RotateLook(float angle);	// rotate on look vector

	virtual void GetViewMatrix(D3DXMATRIX* V); 
	void SetPosition(D3DXVECTOR3* pos)	{	m_Position = *pos;	}
	void GetPosition(D3DXVECTOR3* pos)	{	*pos = m_Position;	}
	void GetRight(D3DXVECTOR3* right)	{	*right = m_Right;	}
	void SetRight(D3DXVECTOR3* right)	{	m_Right = *right;	}
	void GetUp(D3DXVECTOR3* up)			{	*up = m_Up;		}
	void SetUp(D3DXVECTOR3* up)			{	m_Up = *up;		}
	void GetLook(D3DXVECTOR3* look)		{	*look = m_Look;	}
	void SetLook(D3DXVECTOR3* look)		{	m_Look = *look;	}

	float GetRotateYAngle(void);
	float GetRotateXAngle(void);

	virtual void SaveCamera(const char *pFile) const;
	virtual void LoadCamera(const char *pFile);

protected:
	D3DXVECTOR3		m_Right;
	D3DXVECTOR3		m_Up;
	D3DXVECTOR3		m_Look;
	D3DXVECTOR3		m_Position;
};

//---------------------------------------------------
// 第三人称摄像机
//---------------------------------------------------
class ModelViewCamera : public CCamera, public GNode
{
public:
	ModelViewCamera();
	~ModelViewCamera();

	virtual void GetViewMatrix(D3DXMATRIX* V); 
	
	virtual void RotateRight(float angle);
	virtual void RotateUp(float angle);
	virtual void RotateLook(float angle);

	virtual void SaveCamera(const char *pFile) const;
	virtual void LoadCamera(const char *pFile);

	void RotateRightTo(float fDestAngle);
	void RotateUpTo(float fDestAngle);
	void RotateLookTo(float fDestAngle);

	float GetCameraRadius(void);
	void SetCameraRadius(float fRadius);
	void ScaleCameraRadius(float fScale);
	void SetCollision(bool c)	{	m_bCollision = c;		}
	bool GetCollision(void)		{	return m_bCollision;	}
	void SetOffsetParentPos(D3DXVECTOR3 vOffsetPos);
	void GetOffsetParentPos(D3DXVECTOR3 *pOffsetPos);

	float GetYawAngle()	{	return m_fCameraYawAngle;	}

	// 无用的设置, 隐藏基类实现
	void SetPosition(D3DXVECTOR3* pos)	{}
	void SetRight(D3DXVECTOR3* right)	{}
	void SetUp(D3DXVECTOR3* up)			{}
	void SetLook(D3DXVECTOR3* look)		{}
	void MoveLR(float units)			{}
	void MoveUD(float units)			{}
	void MoveFB(float units)			{}

	// 两个基类都有此函数, 重新实现之.
	void GetPosition(D3DXVECTOR3* pos)	{	*pos = m_Position;	}

private:
	// 观察目标点
	D3DXVECTOR3		m_vDestination;
	// 目标点的偏移
	D3DXVECTOR3		m_vOffsetParentPos;
	float			m_fCameraYawAngle;		
	float			m_fCameraPitchAngle;
	float			m_fRadius;
	// 是否限制摄像机在地形之上
	bool			m_bCollision;
};

#endif // _CAMERA_

⌨️ 快捷键说明

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