头文件:
-
-
-
- #pragma once
- #include <d3dx9.h>
- #pragma comment (lib, "d3d9.lib")
- #pragma comment (lib, "d3dx9.lib")
- #include "D3DWindow.h"
- class D3DCamera
- {
- public:
- D3DCamera(LPDIRECT3DDEVICE9 _pd3dDevice);
- public:
- ~D3DCamera(void);
- public:
- VOID resetCamera();
- VOID applyCamera();
- LRESULT mouseProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
- VOID keyProc();
- private:
- VOID setCamera();
- private:
- LPDIRECT3DDEVICE9 m_pd3dDevice;
- BOOL m_bIsRotaion;
- D3DXVECTOR3 m_vPos;
- D3DXVECTOR3 m_vLookAt;
- D3DXVECTOR3 m_vUp;
- D3DXVECTOR3 m_vRight;
- D3DXVECTOR3 m_vDirection;
- FLOAT m_fNear;
- FLOAT m_fFar;
- FLOAT m_fFOV;
- FLOAT m_fAspect;
-
- FLOAT m_fMaxPitch;
- FLOAT m_fMinPitch;
- FLOAT m_fCameraYawAngle;
- FLOAT m_fCameraPitchAngle;
- D3DXVECTOR3 m_vDelta;
- FLOAT m_fSpeed;
- POINT m_LastPoint;
- };
源代码:
-
-
-
- #include "D3DCamera.h"
- #include "D3DImage.h"
-
-
-
- D3DCamera::D3DCamera(LPDIRECT3DDEVICE9 _pd3dDevice)
- {
- m_pd3dDevice = _pd3dDevice;
-
- D3DXMATRIXA16 matView;
- m_vPos = D3DXVECTOR3(0.0f, 0.0f, -WND_HEIGHT/2*ZOOM);
- m_vLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
- m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
- D3DXMatrixLookAtLH( &matView, &m_vPos, &m_vLookAt, &m_vUp );
- m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
-
- D3DXMATRIXA16 matProj;
-
- D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 4.0f/3.0f, 0.0001f, 2000.0f );
- m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
-
- m_vDirection = m_vLookAt - m_vPos;
- D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection );
- m_fCameraYawAngle = D3DX_PI;
- m_fCameraPitchAngle = 0;
- m_fSpeed = ZOOM*0.5;
- m_bIsRotaion = FALSE;
- }
- D3DCamera::~D3DCamera(void)
- {
- }
-
-
-
- VOID D3DCamera::setCamera()
- {
- D3DXMATRIXA16 matView;
- D3DXMatrixLookAtLH( &matView, &m_vPos, &m_vLookAt, &m_vUp );
- m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
- }
-
-
-
- VOID D3DCamera::resetCamera()
- {
- m_vPos = D3DXVECTOR3(0.0f, 0.0f, -WND_HEIGHT/2*ZOOM);
- m_vLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
- m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
- m_vDirection = m_vLookAt - m_vPos;
- D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection );
- m_fCameraYawAngle = D3DX_PI;
- m_fCameraPitchAngle = 0;
- setCamera();
- }
-
-
-
- VOID D3DCamera::applyCamera()
- {
- POINT ptCurrentPos;
- POINT ptDeltaPos;
- if(m_bIsRotaion)
- {
-
- GetCursorPos(&ptCurrentPos);
- ptDeltaPos.x = ptCurrentPos.x - m_LastPoint.x;
- ptDeltaPos.y = ptCurrentPos.y - m_LastPoint.y;
- SetCursorPos(m_LastPoint.x,m_LastPoint.y);
-
- float fYaw = ptDeltaPos.x*0.0025f;
- float fPitch = ptDeltaPos.y*0.0025f;
-
- m_fCameraYawAngle += fYaw;
- m_fCameraPitchAngle -= fPitch;
-
- if(m_fCameraPitchAngle > D3DX_PI*0.49f)
- m_fCameraPitchAngle = D3DX_PI*0.49f;
- else if(m_fCameraPitchAngle < -D3DX_PI*0.49f)
- m_fCameraPitchAngle = -D3DX_PI*0.49f;
- }
-
- D3DXMATRIX matCameraRotation;
- ZeroMemory(&matCameraRotation, sizeof(D3DXMATRIX));
- D3DXMatrixRotationYawPitchRoll(&matCameraRotation, m_fCameraYawAngle,
- m_fCameraPitchAngle,0.0f);
-
-
- D3DXVECTOR3 vWorldUp, vWorldAhead;
- D3DXVECTOR3 vLocalUp = D3DXVECTOR3(0,1,0);
- D3DXVECTOR3 vLocalAhead = D3DXVECTOR3(0,0,-WND_HEIGHT/2*ZOOM);
- D3DXVec3TransformCoord( &vWorldUp, &vLocalUp, &matCameraRotation );
- D3DXVec3TransformCoord( &vWorldAhead, &vLocalAhead, &matCameraRotation );
-
-
- D3DXVECTOR3 vWorldDelta;
- D3DXVec3TransformCoord( &vWorldDelta, &m_vDelta, &matCameraRotation );
-
-
- m_vPos += vWorldDelta;
- if(m_vPos.y < 0)
- m_vPos.y = 0;
- if(m_vPos.y > ZOOM*200)
- m_vPos.y = ZOOM*200;
- m_vLookAt = m_vPos + vWorldAhead;
-
- setCamera();
-
- m_vDirection = m_vLookAt - m_vPos;
- m_vUp = vWorldUp;
- D3DXVec3Cross( &m_vRight, &m_vUp, &m_vDirection );
- }
-
-
-
- LRESULT D3DCamera::mouseProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_RBUTTONDOWN:
- {
- m_bIsRotaion = true;
- SetCapture(hWnd);
- GetCursorPos(&m_LastPoint);
- }
- break;
- case WM_RBUTTONUP:
- {
- m_bIsRotaion = false;
- ReleaseCapture();
- }
- break;
- }
- return 0;
- }
-
-
-
- VOID D3DCamera::keyProc()
- {
- static char _up = VK_SPACE;
- static char _down = 'X';
- static char _left = 'A';
- static char _right = 'D';
- static char _head = 'W';
- static char _back = 'S';
- static char _reset = 'R';
- m_vDelta = D3DXVECTOR3(0, 0, 0);
- if( GetKeyState(_head) & 0x80 )
- {
- m_vDelta.z -= m_fSpeed;
- }
- if( GetKeyState(_back) & 0x80 )
- {
- m_vDelta.z += m_fSpeed;
- }
- if( GetKeyState(_left) & 0x80 )
- {
- m_vDelta.x += m_fSpeed;
- }
- if( GetKeyState(_right) & 0x80 )
- {
- m_vDelta.x -= m_fSpeed;
- }
- if( GetKeyState(_up) & 0x80 )
- {
- m_vPos.y += m_fSpeed;
- }
- if( GetKeyState(_down) & 0x80 )
- {
- m_vPos.y -= m_fSpeed;
- }
- if( GetKeyState(_reset) & 0x80 )
- {
- resetCamera();
- }
- }
(秩名) |