这是自己写的一个摄像机类,但是在调用的时候,按键操作没办法实现,希望高手能帮忙下!!
#include "stdafx.h"
#include "Camera.h"
#include <zmouse.h>
CCamera::CCamera()
{
m_Pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f); //位置
m_LookAt = D3DXVECTOR3(0.0f, 0.0f, 1.0f);//视点
m_Up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);//正方向
m_fNear = 0.0f; //近平面
m_fFar = 0.0f; //远平面
m_fFOV = 0.0f; //FOV夹角
m_fAspect = 0.0f; //纵横比
m_bIsTrans = false; //是否平移
m_vDelta = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
m_fVelocity = 0.01f; //移动速度
m_bIsRot = false; //是否发生旋转
m_fMaxPitch = D3DX_PI*0.49f;
m_fMinPitch = (-D3DX_PI*0.49f); //最小俯仰角
}
CCamera::~CCamera()
{
}
//设置视图矩阵
void CCamera::SetViewParam(D3DXVECTOR3& vPos, D3DXVECTOR3& vLookAt, D3DXVECTOR3& vUp)
{
m_Pos = vPos;
m_LookAt = vLookAt;
m_Up = vUp;
m_Direction = vLookAt-vPos;
D3DXVec3Normalize(&m_Direction,&m_Direction);
D3DXVec3Cross(&m_Right,&m_Up,&m_Direction);
D3DXMatrixLookAtLH(&m_View,&m_Pos,&m_LookAt,&m_Up);
D3DXMATRIX invView;
D3DXMatrixInverse(&invView,0,&m_View);
D3DXVECTOR3 * pZBasis = (D3DXVECTOR3*)&invView._31;
m_fYaw = atan2f(pZBasis->x,pZBasis->z);
float fLen = sqrtf(pZBasis->z*pZBasis->z+pZBasis->x*pZBasis->x);
m_Pitch = -atan2f(pZBasis->y,fLen);
}
//设置投影矩阵
void CCamera::SetProjMatrix(float fFov,float fAspect,float fNear,float fFar)
{
m_fFOV = fFov;
m_fAspect = fAspect;
m_fNear = fNear;
m_fFar = fFar;
D3DXMatrixPerspectiveFovLH(&m_Project,fFov,fAspect,fNear,fFar);
}
//获取视图与投影矩阵
D3DXMATRIX* CCamera::GetViewMatrix(void)
{
return &m_View;
}
D3DXMATRIX* CCamera::GetProjMatrix(void)
{
return &m_Project;
}
//摄象机的平移控制
void CCamera::SetVelocity(float fVelocity)
{
m_fVelocity = fVelocity;
}
void CCamera::ProcessKey(float fElapsedTime)
{
m_vDelta = D3DXVECTOR3(0.f,0.f,0.f);
float fDis = m_fVelocity * fElapsedTime;
if( GetKeyState('W') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.z += fDis;
}
if( GetKeyState('S') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.z -= fDis;
}
if( GetKeyState('A') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.x -= fDis;
}
if( GetKeyState('D') & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.x += fDis;
}
if( GetKeyState(VK_HOME) & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.y += fDis;
}
if( GetKeyState(VK_END) & 0x8000 )
{
m_bIsTrans = true;
m_vDelta.y -= fDis;
}
}
//摄象机的旋转
LRESULT CCamera::HandleMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg )
{
case WM_LBUTTONDOWN:
m_bIsRot = true;
SetCapture(hWnd);
GetCursorPos(&m_LastPoint);
break;
case WM_LBUTTONUP:
m_bIsRot = false;
ReleaseCapture();
break;
}
return 0;
}
//更新摄象机
void CCamera::Update(void)
{
POINT ptCurrentPos = {0, 0};
POINT ptDeltaPos = {0, 0};
GetCursorPos(&ptCurrentPos);
ptCurrentPos.x = ptCurrentPos.x-m_LastPoint.x;
ptCurrentPos.y = ptCurrentPos.y-m_LastPoint.y;
m_LastPoint = ptCurrentPos;
float fYaw = ptDeltaPos.x*0.01f;
float fPitch = ptDeltaPos.y*0.01f;
if (m_bIsRot)
{
m_fYaw +=fYaw;
m_Pitch+=fPitch;
}
if (m_Pitch<-D3DX_PI*0.5f)
{
m_Pitch=-D3DX_PI*0.5f;
}
else if (m_Pitch>D3DX_PI*0.5f)
{
m_Pitch = D3DX_PI*0.5f;
}
D3DXMATRIX matCamera;
ZeroMemory(&matCamera,sizeof(D3DXMATRIX));
D3DXMatrixRotationYawPitchRoll(&matCamera,m_fYaw,m_Pitch,0);
D3DXVECTOR3 vUp,vDirection;
D3DXVec3TransformCoord(&vUp,&D3DXVECTOR3(0,1,0),&matCamera);
D3DXVec3TransformCoord(&vDirection,&D3DXVECTOR3(0,0,1),&matCamera);
if (m_bIsTrans)
{
D3DXVECTOR3 vPosDelta;
D3DXVec3TransformCoord( &vPosDelta, &m_vDelta, &matCamera);
m_Pos += vPosDelta;
}
m_LookAt = m_Pos + vDirection;
D3DXMatrixLookAtLH( &m_View, &m_Pos, &m_LookAt, &m_Up );
m_Direction = m_LookAt - m_Pos;
m_Up = vUp;
D3DXVec3Cross( &m_Right, &vUp,&m_Direction );
}
//获取设备指针
void CCamera::ApplyDevice(LPDIRECT3DDEVICE9 pDevice )
{
if( pDevice )
{
pDevice->SetTransform(D3DTS_VIEW, &m_View);
pDevice->SetTransform(D3DTS_PROJECTION, &m_Project);
}
}