www.pudn.com > SkyBox.rar > Camera.cpp


#include "Camera.h" 
 
CCamera::CCamera() 
{ 
	g_vPos		= D3DXVECTOR3(0.0f, 0.0f, 0.0f); 
 
	g_vRight	= D3DXVECTOR3(1.0f, 0.0f, 0.0f); 
	g_vUp		= D3DXVECTOR3(0.0f, 1.0f, 0.0f); 
	g_vLook		= D3DXVECTOR3(0.0f, 0.0f, 1.0f); 
} 
 
CCamera::~CCamera() 
{ 
} 
 
void CCamera::strafe(float units) 
{ 
	g_vPos += D3DXVECTOR3(g_vRight.x, 0.0f, g_vRight.z) * units; 
} 
 
void CCamera::fly(float units) 
{ 
	g_vPos.y +=  units; 
} 
 
void CCamera::walk(float units) 
{ 
	g_vPos += D3DXVECTOR3(g_vLook.x, 0.0f, g_vLook.z) * units; 
} 
 
void CCamera::pitch(float angle) 
{ 
	D3DXMATRIX T; 
	D3DXMatrixRotationAxis(&T, &g_vRight, angle); 
 
	D3DXVec3TransformCoord(&g_vLook, &g_vLook, &T); 
	D3DXVec3TransformCoord(&g_vUp, &g_vUp, &T); 
} 
 
void CCamera::yaw(float angle) 
{ 
	D3DXMATRIX T; 
	D3DXMatrixRotationY(&T, angle); 
 
	D3DXVec3TransformCoord(&g_vLook, &g_vLook, &T); 
	D3DXVec3TransformCoord(&g_vRight, &g_vRight, &T); 
} 
 
void CCamera::getViewMatrix(D3DXMATRIX *V) 
{ 
	D3DXVec3Normalize(&g_vLook, &g_vLook); 
 
	D3DXVec3Cross(&g_vUp, &g_vLook, &g_vRight); 
	D3DXVec3Normalize(&g_vUp, &g_vUp); 
 
	D3DXVec3Cross(&g_vRight, &g_vUp, &g_vLook); 
	D3DXVec3Normalize(&g_vRight, &g_vRight); 
 
	float x = -D3DXVec3Dot(&g_vRight, &g_vPos); 
	float y = -D3DXVec3Dot(&g_vUp   , &g_vPos); 
	float z = -D3DXVec3Dot(&g_vLook , &g_vPos); 
 
	V->_11 = g_vRight.x; V->_12 = g_vUp.x; V->_13 = g_vLook.x; V->_14 = 0.0f; 
	V->_21 = g_vRight.y; V->_22 = g_vUp.y; V->_23 = g_vLook.y; V->_24 = 0.0f; 
	V->_31 = g_vRight.z; V->_32 = g_vUp.z; V->_33 = g_vLook.z; V->_34 = 0.0f; 
	V->_41 = x         ; V->_42 = y      ; V->_43 = z        ; V->_44 = 1.0f; 
} 
 
void CCamera::getPosition(D3DXVECTOR3 *pos) 
{ 
	*pos = g_vPos; 
} 
 
void CCamera::setPosition(const D3DXVECTOR3 *pos) 
{ 
	g_vPos = *pos; 
} 
 
void CCamera::ProcInput() 
{  
	float fDelta = 0.0008f; 
 
	POINT pt; 
	GetCursorPos( &pt ); 
	static DWORD beginX = pt.x; 
	static DWORD beginY = pt.y; 
	static DWORD mouseX = pt.x; 
	static DWORD mouseY = pt.y; 
 
	GetCursorPos( &pt ); 
	int dx = pt.x - mouseX; 
	int dy = pt.y - mouseY; 
 
	pitch((float)dy * fDelta); 
	yaw((float)dx * fDelta); 
 
	SetCursor(NULL); 
 
	SetCursorPos(beginX, beginY); 
	mouseX = beginX; 
	mouseY = beginY; 
 
	if(KEYDOWN('W')) 
	{ 
		walk(100.0f * fDelta); 
	} 
	if(KEYDOWN('S')) 
	{ 
		walk(-100.0f * fDelta); 
	} 
	if(KEYDOWN('A')) 
	{ 
		strafe(-100.0f * fDelta); 
	} 
	if(KEYDOWN('D')) 
	{ 
		strafe(100.0f * fDelta); 
	} 
 
	return; 
}