Dx基本Camera类

#ifndef __CameraH__
#define __CameraH__

#include <d3d9.h>
#include <d3dx9.h>
#include <Windows.h>

class CCamera
{
private:
 IDirect3DDevice9* m_pDevice;
 D3DXVECTOR3 m_vPos;
 POINT m_LastPoint;
 float m_fYaw, m_fPitch, m_fVelocity;
 bool m_bIsRot;
private:
 void SetView();
public:
 void SetCamera(IDirect3DDevice9* pDevice, D3DXVECTOR3 vPos, float fYaw, float fPitch, float fVelocity);
 void Logic(float fElapsedTime);
 void Handle(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
void CCamera::SetCamera(IDirect3DDevice9* pDevice, D3DXVECTOR3 vPos, float fYaw, float fPitch, float fVelocity)
{
 m_pDevice = pDevice; m_vPos = vPos; m_fYaw = fYaw; m_fPitch = fPitch; m_fVelocity = fVelocity;
 m_bIsRot = false;
 SetView();
}
void CCamera::Logic(float fElapsedTime)
{
 D3DXVECTOR3 vDelta(0.0f, 0.0f, 0.0f);
 bool bOk = false;
 float fDistance = m_fVelocity * fElapsedTime;
 if(GetAsyncKeyState('W') & 0x8000) { vDelta.z += fDistance; bOk = true; }
 if(GetAsyncKeyState('S') & 0x8000) { vDelta.z -= fDistance; bOk = true; }
 if(GetAsyncKeyState('A') & 0x8000) { vDelta.x -= fDistance; bOk = true; }
 if(GetAsyncKeyState('D') & 0x8000) { vDelta.x += fDistance; bOk = true; }
 if(GetAsyncKeyState(VK_HOME) & 0x8000) { vDelta.y += fDistance; bOk = true; }
 if(GetAsyncKeyState(VK_END) & 0x8000) { vDelta.y -= fDistance; bOk = true; }
 if(bOk)
 {
  D3DXMATRIX matRot;
  D3DXMatrixRotationYawPitchRoll(&matRot, m_fYaw, m_fPitch, 0.0f);
  D3DXVec3TransformNormal(&vDelta, &vDelta, &matRot);
  m_vPos += vDelta;
 }
 if(m_bIsRot)
 {
  POINT CurrentPoint;
  GetCursorPos(&CurrentPoint);
  POINT DeltaPoint;
  DeltaPoint.x = CurrentPoint.x - m_LastPoint.x;
  DeltaPoint.y = CurrentPoint.y - m_LastPoint.y;
  m_LastPoint = CurrentPoint;
  m_fYaw += DeltaPoint.x * 0.01f;
  m_fPitch += DeltaPoint.y * 0.01f;
 }
 SetView();
}
void CCamera::Handle(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 if(uMsg == WM_RBUTTONDOWN)
 {
  m_bIsRot = true;
  GetCursorPos(&m_LastPoint);
  SetCapture(hWnd);
 }
 else if(uMsg == WM_RBUTTONUP)
 {
  m_bIsRot = false;
  ReleaseCapture();
 }
}
void CCamera::SetView()
{
 D3DXVECTOR3 vPos = m_vPos;
 D3DXMATRIX matRot;
 D3DXMatrixRotationYawPitchRoll(&matRot, m_fYaw, m_fPitch, 0.0f);
 D3DXVECTOR3 vDir;
 D3DXVec3TransformNormal(&vDir, &D3DXVECTOR3(0.0f, 0.0f, 1.0f), &matRot);
 D3DXVECTOR3 vLookAt = vPos + vDir;
 D3DXVECTOR3 vUp;
 D3DXVec3TransformNormal(&vUp, &D3DXVECTOR3(0.0f, 1.0f, 0.0f), &matRot);
 D3DXMATRIX matView;
 D3DXMatrixLookAtLH(&matView, &vPos, &vLookAt, &vUp);
 m_pDevice->SetTransform(D3DTS_VIEW, &matView);
}
#endif

转载于:https://www.cnblogs.com/ketmales/archive/2012/05/01/2478235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值