📄 camera.h
字号:
#ifdef CGE_HEADER_H
#ifndef CGE_CAMERA_H
#define CGE_CAMERA_H
namespace CGE
{
namespace MATRIX
{
typedef class CAMERA
{
public:
CAMERA()
{
m_vEyeAt.x = m_vEyeAt.y = m_vEyeAt.z = 0;
m_vLookAt.x = m_vLookAt.y = m_vLookAt.z = 0;
m_vUp.x = m_vUp.y = m_vUp.z = 0;
}
virtual ~CAMERA(){};
VOID MatrixTranslateXYZAxis(FLOAT fSpeed);
VOID MatrixTranslateXZAxis(FLOAT fSpeed);
VOID MatrixLookAt( D3DXVECTOR3 vEyeAt,D3DXVECTOR3 vLookAt,D3DXVECTOR3 vUp);
VOID MatrixRotationAxis(FLOAT fPitch,FLOAT fYaw);
VOID MatrixTranslateXAxis(FLOAT fSpeed);
VOID MatrixTranslateZAxis(FLOAT fSpeed);
VOID MatrixTranslateYAxis(FLOAT fSpeed);
VOID LayAt(D3DXVECTOR3 vPos);
D3DXMATRIX MatrixLookAtLH();
D3DXMATRIX MatrixPerspectiveFovLH(FLOAT fovy,FLOAT Aspect,FLOAT zn,FLOAT zf);
D3DXVECTOR3 EyeAt() { return m_vEyeAt; }
D3DXVECTOR3 LookAt() { return m_vLookAt; }
D3DXVECTOR3 UpAt() { return m_vUp; }
protected:
D3DXVECTOR3 m_vEyeAt;
D3DXVECTOR3 m_vLookAt;
D3DXVECTOR3 m_vUp;
}*LPCAMERA;
CGE_INLINE VOID
CAMERA::LayAt(D3DXVECTOR3 vPos)
{
D3DXVECTOR3 vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Normalize(&vView,&vView);
m_vEyeAt = vPos;
m_vLookAt = m_vEyeAt + vView;
};
CGE_INLINE VOID
CAMERA::MatrixTranslateYAxis(FLOAT fSpeed)
{
D3DXVECTOR3 vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Normalize(&vView,&vView);
m_vEyeAt.y += vView.y * fSpeed;
m_vLookAt.y += vView.y * fSpeed;
}
CGE_INLINE VOID
CAMERA::MatrixTranslateXAxis(FLOAT fSpeed)
{
D3DXVECTOR3 vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Normalize(&vView,&vView);
m_vEyeAt.x += vView.x * fSpeed;
m_vLookAt.x += vView.x * fSpeed;
}
CGE_INLINE VOID
CAMERA::MatrixTranslateZAxis(FLOAT fSpeed)
{
D3DXVECTOR3 vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Normalize(&vView,&vView);
m_vEyeAt.z += vView.z * fSpeed;
m_vLookAt.z +=vView.z * fSpeed;
}
CGE_INLINE VOID
CAMERA::MatrixLookAt( D3DXVECTOR3 vEyeAt,D3DXVECTOR3 vLookAt,D3DXVECTOR3 vUp)
{
m_vEyeAt = vEyeAt;
m_vLookAt = vLookAt;
m_vUp = vUp;
}
CGE_INLINE VOID
CAMERA::MatrixTranslateXYZAxis(FLOAT fSpeed)
{
D3DXVECTOR3 vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Normalize(&vView,&vView);
m_vEyeAt += vView * fSpeed;
m_vLookAt += vView * fSpeed;
}
CGE_INLINE VOID
CAMERA::MatrixTranslateXZAxis( FLOAT fSpeed )
{
D3DXVECTOR3 vXZ,vView;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Cross(&vXZ,&vView,&m_vUp);
D3DXVec3Normalize(&vXZ,&vXZ);
m_vEyeAt.x += vXZ.x * fSpeed;
m_vEyeAt.z += vXZ.z * fSpeed;
m_vLookAt.x += vXZ.x * fSpeed;
m_vLookAt.z += vXZ.z * fSpeed;
}
CGE_INLINE VOID
CAMERA::MatrixRotationAxis(FLOAT fPitch,FLOAT fYaw)
{
CHECK_RANGE( fPitch, -0.5f, 0.5f );
CHECK_RANGE( fYaw, -6.28f, 6.28f );
D3DXVECTOR3 vRotAxis,vView;
D3DXQUATERNION qRot;
D3DXMATRIX matRot;
D3DXVec3Subtract(&vView,&m_vLookAt,&m_vEyeAt);
D3DXVec3Cross(&vRotAxis,&vView,&m_vUp);
D3DXVec3Normalize(&vRotAxis,&vRotAxis);
if ( fPitch != 0 )
{
D3DXQuaternionRotationAxis(&qRot,&vRotAxis,fPitch);
D3DXMatrixRotationQuaternion(&matRot,&qRot);
D3DXVec3TransformCoord(&vView,&vView,&matRot);
m_vLookAt = m_vEyeAt + vView;
}
if ( fYaw != 0 )
{
D3DXQuaternionRotationAxis(&qRot,&D3DXVECTOR3(0,1,0),fYaw);
D3DXMatrixRotationQuaternion(&matRot,&qRot);
D3DXVec3TransformCoord(&vView,&vView,&matRot);
m_vLookAt = m_vEyeAt + vView;
}
}
CGE_INLINE D3DXMATRIX
CAMERA::MatrixPerspectiveFovLH(FLOAT fovy,FLOAT Aspect,FLOAT zn,FLOAT zf)
{
D3DXMATRIX mat;
D3DXMatrixPerspectiveFovLH(&mat,fovy,Aspect,zn,zf);
return mat;
}
CGE_INLINE D3DXMATRIX
CAMERA::MatrixLookAtLH()
{
D3DXMATRIX mat;
D3DXVECTOR3 vLook;
D3DXVECTOR3 vUp;
D3DXVECTOR3 vRight;
D3DXMatrixIdentity( &mat );
D3DXVec3Subtract(&vLook, &m_vLookAt, &m_vEyeAt);
D3DXVec3Normalize( &vLook, &vLook );
D3DXVec3Cross( &vRight, &m_vUp, &vLook );
D3DXVec3Normalize( &vRight, &vRight );
D3DXVec3Cross( &vUp, &vLook, &vRight );
D3DXVec3Normalize( &vUp, &vUp );
mat._11 = vRight.x;
mat._12 = vUp.x;
mat._13 = vLook.x;
mat._14 = 0.0f;
mat._21 = vRight.y;
mat._22 = vUp.y;
mat._23 = vLook.y;
mat._24 = 0.0f;
mat._31 = vRight.z;
mat._32 = vUp.z;
mat._33 = vLook.z;
mat._34 = 0.0f;
mat._41 = -D3DXVec3Dot( &m_vEyeAt, &vRight );
mat._42 = -D3DXVec3Dot( &m_vEyeAt, &vUp );
mat._43 = -D3DXVec3Dot( &m_vEyeAt, &vLook );
mat._44 = 1.0f;
return mat;
}
}
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -