📄 cameralock.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 + -