www.pudn.com > Render.rar > SJJ_Camera.cpp


#include ".\sjj_camera.h" 
 
//把摄像机向量初始化为标准矩阵 
SJJ_Camera::SJJ_Camera(void) 
{ 
	vCameraPos.x=0.0f; 
	vCameraPos.y=0.0f; 
	vCameraPos.z=0.0f; 
    vCameraLook.x=0.0f; 
	vCameraLook.y=0.0f; 
	vCameraLook.z=1.0f; 
    vCameraUp.x=0.0f; 
	vCameraUp.y=1.0f; 
	vCameraUp.z=0.0f; 
    vCameraRight.x=1.0f; 
	vCameraRight.y=0.0f; 
	vCameraRight.z=0.0f; 
} 
 
SJJ_Camera::~SJJ_Camera(void) 
{ 
} 
 
//------------------------------------------------------------------------------- 
//功能描述:  在对摄像机进行操作后,最后调用此函数设置相机 
//参数描述:  pD3DDevice: D3D设备,在common结构中可直接传递m_pd3dDevice 
//------------------------------------------------------------------------------- 
void SJJ_Camera::SetCamera(LPDIRECT3DDEVICE9 pD3DDevice) 
{ 
	D3DXMATRIX view; 
	D3DXMatrixIdentity( &view ); 
	view._11 = vCameraRight.x;  
	view._12 = vCameraUp.x;  
	view._13 = vCameraLook.x; 
	view._21 = vCameraRight.y;  
	view._22 = vCameraUp.y;  
	view._23 = vCameraLook.y; 
	view._31 = vCameraRight.z;  
	view._32 = vCameraUp.z;  
	view._33 = vCameraLook.z; 
	view._41 = - D3DXVec3Dot( &vCameraPos, &vCameraRight );  
	view._42 = - D3DXVec3Dot( &vCameraPos, &vCameraUp ); 
	view._43 = - D3DXVec3Dot( &vCameraPos, &vCameraLook ); 
 
	pD3DDevice->SetTransform(D3DTS_VIEW, &view);  
} 
 
//------------------------------------------------------------------------------ 
//功能描述:  把摄像机绕Y轴旋转一定角度,即左右转动视野 
//参数描述:  fYaw :旋转程度,不对应旋转角度,但是可以乘以灵敏度以调节转动速度 
//------------------------------------------------------------------------------ 
void SJJ_Camera::RotateCamera_LeftRight(float fYaw) 
{ 
	//建立对应fYaw的旋转矩阵 
    D3DXMATRIX matYaw; 
	D3DXVECTOR3 StaticY(0.0f,1.0f,0.0f);//Y轴,绝对竖直 
	D3DXMatrixRotationAxis(&matYaw,&StaticY,fYaw); 
 
	//旋转vCameraLook,vCameraRight,vCameraUp 
	D3DXVec3TransformCoord(&vCameraLook,&vCameraLook,&matYaw); 
    D3DXVec3TransformCoord(&vCameraRight,&vCameraRight,&matYaw); 
	D3DXVec3TransformCoord(&vCameraUp,&vCameraUp,&matYaw); 
 
} 
 
//------------------------------------------------------------------------------- 
//功能描述:  把摄像机绕右手vCameraRight上下转动,即视野抬头和低头 
//参数描述:  fPitch:旋转程度,不对应旋转角度,但是可以乘以灵敏度以调节转动速度 
//------------------------------------------------------------------------------- 
void SJJ_Camera::RotateCamera_UpDown(float fPitch) 
{ 
    //建立对应fPitch的旋转矩阵 
    D3DXMATRIX matPitch; 
	D3DXMatrixRotationAxis(&matPitch,&vCameraRight,fPitch); 
 
	//旋转vCameraLook,vCameraUp 
	D3DXVec3TransformCoord(&vCameraLook,&vCameraLook,&matPitch); 
	D3DXVec3TransformCoord(&vCameraUp,&vCameraUp,&matPitch); 
} 
 
//------------------------------------------------------------------------------- 
//功能描述:  把摄像机左右移动位置,但视线方向不变 
//参数描述:  fLR :左右移动距离,右正左负,以vCameraRight位基准方向,可以乘灵敏度调节速度 
//------------------------------------------------------------------------------- 
void SJJ_Camera::MoveCamera_LeftRight(float fLR) 
{ 
	D3DXVec3Normalize(&vCameraRight,&vCameraRight); 
    vCameraPos+=(fLR*vCameraRight); 
} 
 
//------------------------------------------------------------------------------- 
//功能描述:  把摄像机前后移动,但视线方向不变 
//参数描述:  fUD :前后移动举例,前正后负,以vCameraLook为基准方向,可以乘灵敏度以调节速度 
//------------------------------------------------------------------------------- 
void SJJ_Camera::MoveCamera_UpDown(float fUD) 
{ 
	D3DXVec3Normalize(&vCameraLook,&vCameraLook); 
	vCameraPos+=(fUD*vCameraLook); 
} 
void SJJ_Camera::MoveCamera_SX(float fSX) 
{ 
	D3DXVec3Normalize(&vCameraUp,&vCameraUp); 
	vCameraPos+=(fSX*vCameraUp); 
} 
 
//-------------------------------------------------------------------------------- 
//功能描述:  设定摄像机的方位坐标 
//参数描述:  x,y,z是方位3维坐标 
//-------------------------------------------------------------------------------- 
void SJJ_Camera::SetCameraPos(float x,float y,float z) 
{ 
	vCameraPos.x=x; 
	vCameraPos.y=y; 
	vCameraPos.z=z; 
} 
 
//-------------------------------------------------------------------------------- 
//功能描述:  获取摄像机的方位坐标 
//参数描述:  x,y,z是方位3维坐标 
//-------------------------------------------------------------------------------- 
void SJJ_Camera::GetCameraPos(float* x, float* y, float* z) 
{ 
	*x = vCameraPos.x; 
	*y = vCameraPos.y; 
	*z = vCameraPos.z; 
}