📄 camera.cpp
字号:
#include "StdAfx.h"
#include ".\camera.h"
CCamera::CCamera(void)
: m_pDevice(NULL)
,m_vUp(0.0f, 1.0f, 0.0f)
{
}
CCamera::~CCamera(void)
{
}
// 位置
void CCamera::SetPosition(LPD3DXVECTOR3 pvPos)
{
m_vPosition = *pvPos;
ApplyChange();
}
// 目标
void CCamera::SetTarget(LPD3DXVECTOR3 pvTarget, bool bUpReset /*= true*/)
{
if(bUpReset)
{
m_vUp.x = 0.0f;
m_vUp.y = 1.0f;
m_vUp.z = 0.0f;
}
m_vTarget = *pvTarget;
ApplyChange();
}
// 前进(后退)
void CCamera::GotoDest(float fDistance)
{
D3DXVECTOR3 vDir = GetDirection();
m_vPosition += vDir * fDistance;
SetDirection(&vDir);
}
// 侧移
void CCamera::Move(float fLeftRight, float fUpDown)
{
D3DXVECTOR3 vDir = GetDirection();
if(fLeftRight < -0.00001f || fLeftRight > 0.000001f)
{
D3DXVECTOR3 vAxis;
D3DXVec3Cross(&vAxis, &m_vUp, &vDir);
m_vPosition += vAxis * fLeftRight;
}
if(fUpDown < -0.00001f || fUpDown > 0.000001f)
{
m_vPosition += m_vUp * fUpDown;
}
SetDirection(&vDir);
}
// 方向
void CCamera::SetDirection(LPD3DXVECTOR3 pvDir)
{
// 根据方向确定目标
//D3DXVECTOR3 vDir = *pvDir;
//D3DXMATRIX matTemp(1.f, 0.f, 0.f, 0.f,
// 0.f, 1.f, 0.f, 0.f,
// 0.f, 0.f, 1.f, 0.f,
// vDir.x, vDir.y, vDir.z, 1.f);
//D3DXVec3TransformCoord(&m_vTarget, &m_vPosition, &matTemp);
m_vTarget = m_vPosition + *pvDir;
// 设置摄像机
ApplyChange();
}
void CCamera::ApplyChange()
{
assert(m_pDevice);
// LookAt
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView,
&m_vPosition,
&m_vTarget,
&m_vUp);
m_pDevice->SetTransform(D3DTS_VIEW, &matView);
}
void CCamera::Rotate(float fYaw /*= 0.0f*/, float fPitch /*= 0.0f*/, float fRoll /*= 0.0f*/, bool bForceUp /*= true*/)
{
// Yaw
if(fYaw < -0.00001f || fYaw > 0.000001f)
{
D3DXMATRIX matRotate;
if(bForceUp)
{
D3DXMatrixRotationY(&matRotate, fYaw);
// vUp
D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);
}
else
{
D3DXMatrixRotationAxis(&matRotate, &m_vUp, fYaw);
}
// vTarget
m_vTarget -= m_vPosition;
D3DXVec3TransformCoord(&m_vTarget, &m_vTarget, &matRotate);
m_vTarget += m_vPosition;
}
// Pitch
if(fPitch < -0.00001f || fPitch > 0.000001f)
{
D3DXVECTOR3 vAxis;
D3DXVec3Cross(&vAxis, &m_vUp, &(m_vTarget - m_vPosition));
D3DXMATRIX matRotate;
D3DXMatrixRotationAxis(&matRotate, &vAxis, fPitch);
// vUp
D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);
// vTarget
m_vTarget -= m_vPosition;
D3DXVec3TransformCoord(&m_vTarget, &m_vTarget, &matRotate);
m_vTarget += m_vPosition;
}
// Roll
if(fRoll < -0.00001f || fRoll > 0.000001f)
{
// vUp
D3DXMATRIX matRotate;
D3DXMatrixRotationAxis(&matRotate, &(m_vTarget - m_vPosition), fRoll);
D3DXVec3TransformCoord(&m_vUp, &m_vUp, &matRotate);
}
// 设置摄像机
ApplyChange();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -