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

📄 cameralock.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: Camera Lock
//  Author: artsylee/2007.4.18
//--------------------------------------------------

#include "CameraLock.h"
#include "Common.h"
#include "Heightmap.h"
#include "SkyBox.h"
#include "NodeAdjust.h"

extern CNodeAdjust	g_NodeAdjust;

extern CSkyBox	skybox;
extern CHeightmap g_Hmap;
D3DXVECTOR3 g_CameraPos;

CCameraLock::CCameraLock()
{
	m_pMVCamera = NULL;
	m_pFreeCamera = NULL;
	m_pCurCamera = NULL;
	m_fFreeCameraStep = 2.0f;
	m_fFreeCameraHeight = 8.0f;
	m_bUpdateViewer = true;
	m_fMouseSensitivity = 0.005f;
	m_fMinRadius = 13.0f;
	m_fMaxRadius = 300.0f;
	m_fRadiusStep = 0.5f;

	m_bMouseRotateY = false;
	m_bMouseRotateYEnd = false;
	m_bMouseMove = true;
}

CCameraLock::~CCameraLock()
{
	S_DELETE(m_pMVCamera);
	S_DELETE(m_pFreeCamera);
	m_pCurCamera = NULL;
}

void CCameraLock::Load()
{
	//--------------------------------------------------- 
	// Camera
	m_pMVCamera = new ModelViewCamera;
	if(m_pMVCamera == NULL)	return;
//	m_PlayerMesh.AddChildNode(m_pMVCamera);
	m_pMVCamera->SetOffsetParentPos(D3DXVECTOR3(0.0f, 13.0f, 0.0f));
	m_pMVCamera->SetName("MVCamera");

	m_pFreeCamera = new CCamera;
	if(m_pMVCamera == NULL) return;

	m_pCurCamera = m_pMVCamera;
	m_bUpdateViewer = true;
	LoadCamera("Config\\Camera.ini");
	m_pMVCamera->LoadCamera("Config\\Camera.ini");
	m_pFreeCamera->LoadCamera("Config\\Camera.ini");
	//---------------------------------------------------
}

void CCameraLock::SetCamera(int num)
{
	if(num == CT_MODELVIEW)	m_pCurCamera = m_pMVCamera;
	if(num == CT_FREEVIEW)	m_pCurCamera = m_pFreeCamera;
	m_bUpdateViewer = true;
	//if(m_pCurCamera == NULL) assert;
}

int CCameraLock::GetCamera(void)
{
	if(m_pCurCamera==m_pMVCamera)	return CT_MODELVIEW;
	if(m_pCurCamera==m_pFreeCamera)	return CT_FREEVIEW;
	return CT_INVALID;
}

void CCameraLock::SaveCamera(const char *pFile) const
{
	CIniFile camera(pFile);
	camera.WriteFloat("CameraControl", "FreeCameraStep", m_fFreeCameraStep);
	camera.WriteFloat("CameraControl", "FreeCameraHeight", m_fFreeCameraHeight);
	camera.WriteFloat("CameraControl", "MinRadius", m_fMinRadius);
	camera.WriteFloat("CameraControl", "MaxRadius", m_fMaxRadius);
	camera.WriteFloat("CameraControl", "RadiusStep", m_fRadiusStep);
	camera.Save();
}

void CCameraLock::LoadCamera(const char *pFile)
{
	CIniFile camera(pFile);
	m_fFreeCameraStep = camera.ReadFloat("CameraControl", "FreeCameraStep");
	m_fFreeCameraHeight = camera.ReadFloat("CameraControl", "FreeCameraHeight");
	m_fMinRadius = camera.ReadFloat("CameraControl", "MinRadius");
	m_fMaxRadius = camera.ReadFloat("CameraControl", "MaxRadius");
	m_fRadiusStep = camera.ReadFloat("CameraControl", "RadiusStep");
}

//---------------------------------------------------
// 摄像机控制
//---------------------------------------------------
void CCameraLock::CameraControl(void)
{
	if(IsMouseDown(LBUTTON) && (g_CursorOffsetX || g_CursorOffsetY) && m_bMouseMove)
	{
		m_pCurCamera->RotateUp(g_CursorOffsetX*m_fMouseSensitivity);
		m_pCurCamera->RotateRight(g_CursorOffsetY*m_fMouseSensitivity);
		m_bUpdateViewer = true;
		if(g_CursorOffsetX)	m_bMouseRotateY = true;
	}
	if(g_stInputInfo.MouseValue == LB_UP && m_bMouseRotateY)
	{
		m_bMouseRotateYEnd = true;
		m_bMouseRotateY = false;
	}
	if(m_pCurCamera == m_pFreeCamera)
	{
		if(IsKeyDown(DIK_W))	{ m_pCurCamera->MoveFB(m_fFreeCameraStep);	m_bUpdateViewer = true;	}
		if(IsKeyDown(DIK_S))	{ m_pCurCamera->MoveFB(-m_fFreeCameraStep);	m_bUpdateViewer = true;	}
		if(IsKeyDown(DIK_A))	{ m_pCurCamera->MoveLR(-m_fFreeCameraStep);	m_bUpdateViewer = true;	}
		if(IsKeyDown(DIK_D))	{ m_pCurCamera->MoveLR(m_fFreeCameraStep);	m_bUpdateViewer = true;	}
		if(IsKeyDown(DIK_R) || g_CursorOffsetZ>0)	m_fFreeCameraHeight += m_fFreeCameraStep;	//m_pCurCamera->MoveUD(m_fFreeCameraStep);
		if(IsKeyDown(DIK_F) || g_CursorOffsetZ<0)	m_fFreeCameraHeight -= m_fFreeCameraStep;	//m_pCurCamera->MoveUD(-m_fFreeCameraStep);	
	}
	else
	{
		if(IsKeyDown(DIK_R) || g_CursorOffsetZ<0)
		{
			ModelViewCamera* pCamera = (ModelViewCamera*)(m_pCurCamera);
			float CurRadius = pCamera->GetCameraRadius();
			if(CurRadius < m_fMaxRadius)
			{
				pCamera->SetCameraRadius(CurRadius+m_fRadiusStep);
				m_bUpdateViewer = true;
			}
		}
		if(IsKeyDown(DIK_F) || g_CursorOffsetZ>0)
		{
			ModelViewCamera* pCamera = (ModelViewCamera*)(m_pCurCamera);
			float CurRadius = pCamera->GetCameraRadius();
			if(CurRadius > m_fMinRadius)
			{
				pCamera->SetCameraRadius(CurRadius-m_fRadiusStep);
				m_bUpdateViewer = true;
			}	
		}
	}
	// 开启节点编辑工具时应关闭此处的上下方向键
	if(m_pCurCamera == m_pFreeCamera)
	{
		if(IsKeyDown(DIK_DOWN)&&(!g_NodeAdjust.IsActive()))	{ m_pCurCamera->RotateRight(0.01f);	}
		if(IsKeyDown(DIK_UP)&&(!g_NodeAdjust.IsActive()))	{ m_pCurCamera->RotateRight(-0.01f);}
		if(IsKeyDown(DIK_LEFT))	{ m_pCurCamera->RotateUp(-0.01f); m_bUpdateViewer = true;}
		if(IsKeyDown(DIK_RIGHT)){ m_pCurCamera->RotateUp(0.01f);  m_bUpdateViewer = true;}
	}
}

void CCameraLock::UpdateView(void)
{
	m_pCurCamera->GetPosition(&g_CameraPos);
	skybox.SetCenter(D3DXVECTOR3(g_CameraPos.x, -1200, g_CameraPos.z));
	if(m_pCurCamera == m_pFreeCamera)
	{
		g_CameraPos.y = g_Hmap.GetHeight(g_CameraPos.x, g_CameraPos.z)+m_fFreeCameraHeight;
		m_pCurCamera->SetPosition(&g_CameraPos);
	}

	D3DXMATRIX matCamera;
	m_pCurCamera->GetViewMatrix(&matCamera);
	g_pD3DDevice->SetTransform(D3DTS_VIEW, &matCamera);
}

void CCameraLock::Update(void)
{
	UpdateView();
	/*
	//---------------------------------------------------
	// Save position
	//---------------------------------------------------
	if(g_stInputInfo.KEYVALUE==DIK_F7)
	{
	m_pCurCamera->SaveCamera("Config\\Camera.ini");
	}
	//---------------------------------------------------
	// Load position
	//---------------------------------------------------
	if(g_stInputInfo.KEYVALUE==DIK_F8)
	{
	m_pCurCamera->LoadCamera("Config\\Camera.ini");
	// 第三人称摄像机需要获取摄像机位置
	if(m_pCurCamera == m_pMVCamera)
	{
	D3DXMATRIX matTemp;
	m_pCurCamera->GetViewMatrix(&matTemp);
	}
	m_bUpdateViewer = true;
	}
	*/
	
	if(m_bUpdateViewer)
	{
		D3DXVECTOR3 pos;
		m_pCurCamera->GetPosition(&pos);
		g_Hmap.SetViewPosition(pos);

		g_Hmap.SetViewRotateY(m_pCurCamera->GetRotateYAngle());
		g_Hmap.UpdateHeightmap();
		m_bUpdateViewer = false; 
	}
}

void CCameraLock::RenderInfo(void)
{
	//---------------------------------------------------
	// 摄像机状态(此处资源消耗0.5ms-5.2ms)
	//---------------------------------------------------
	D3DXVECTOR3 vec;
	m_pCurCamera->GetPosition(&vec);
	D3DXVECTOR3 pos(vec.x, vec.y, vec.z);
	DrawSingleLine(0, 16, 0xffffffff, false, "Camera Position: (%.2f, %.2f, %.2f)", vec.x, vec.y, vec.z);
	DrawSingleLine(0, 32, 0xffffffff, false, "Heightmap Height: %.2f", g_Hmap.GetHeight(&vec));
	/*
	m_pCurCamera->GetUp(&vec);
	DrawSingleLine(0, 32, 0xffffffff, false, "up: (%.2f, %.2f, %.2f)", vec.x, vec.y, vec.z);
	m_pCurCamera->GetRight(&vec);
	DrawSingleLine(0, 48, 0xffffffff, false, "right: (%.2f, %.2f, %.2f)", vec.x, vec.y, vec.z);
	m_pCurCamera->GetLook(&vec);
	DrawSingleLine(0, 64, 0xffffffff, false, "look: (%.2f, %.2f, %.2f)", vec.x, vec.y, vec.z);
	DrawSingleLine(0, 80, 0xffffffff, false, "Rotate Y(%.4f), X(%.4f) angle.", m_pCurCamera->GetRotateYAngle(), m_pCurCamera->GetRotateXAngle());
	POINT pt = g_Hmap.ConvertToHeightmap(&pos);
	DrawSingleLine(0, 116, 0xffffffff, false, "Heightmap pos<%d, %d>", pt.x, pt.y);
	*/
	//---------------------------------------------------
}

⌨️ 快捷键说明

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