📄 camera.cpp
字号:
// Camera.cpp: implementation of the CCamera class.
//
//////////////////////////////////////////////////////////////////////
#include "Camera.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCamera::CCamera()
{
D3DXVECTOR3 eye(0.0f,0.0f,0.0f);
D3DXVECTOR3 lookat(0.0f,0.0f,-1.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMatrixIdentity( &m_matView );
D3DXMatrixIdentity( &m_matBill );
D3DXMatrixIdentity( &m_matWorld );
D3DXMatrixIdentity( &m_matProj );
SetView( &eye, &lookat, &up );
}
D3DXMATRIX* CCamera::SetView( D3DXVECTOR3* pvEye,D3DXVECTOR3* pvLookat,D3DXVECTOR3* pvUp)
{
m_vEye = *pvEye;
m_vLookat = *pvLookat;
m_vUp = *pvUp;
D3DXVec3Normalize( &m_vView, &( m_vLookat - m_vEye ) );
D3DXVec3Cross( &m_vCross, &m_vUp, &m_vView );
D3DXMatrixLookAtLH( &m_matView, &m_vEye, &m_vLookat, &m_vUp);
D3DXMatrixInverse( &m_matBill, NULL, &m_matView );
m_matBill._41 = 0.0f;
m_matBill._42 = 0.0f;
m_matBill._43 = 0.0f;
return &m_matView;
}
D3DXMATRIX* CCamera::RotateLocalX( float angle ) // 以local x轴为中心旋转,主要使用这个.
{
D3DXMATRIX matRot;
D3DXMatrixRotationAxis( &matRot, &m_vCross, angle );
D3DXVECTOR3 vNewDst,vNewUp;
D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot ); // 通过view * rot求得新的 dst vector.
// D3DXVec3Cross( &vNewUp, &vNewDst, &m_vCross ); // 通过cross( dst, x轴)求得 up vector.
// D3DXVec3Normalize( &vNewUp, &vNewUp ); // up vector变为 unit vector...
vNewDst += m_vEye; // 实际 dst position = eye Position + dst vector
// return SetView( &m_vEye, &vNewDst, &vNewUp );
return SetView( &m_vEye, &vNewDst, &m_vUp );
}
D3DXMATRIX* CCamera::RotateLocalY( float angle ) // 以local y轴为中心旋转,主要使用这个.
{
D3DXMATRIX matRot;
D3DXMatrixRotationAxis( &matRot, &m_vUp, angle );
D3DXVECTOR3 vNewDst;
D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot ); // 通过view * rot求得新的 dst vector.
vNewDst += m_vEye; // 实际 dst position = eye Position + dst vector
return SetView( &m_vEye, &vNewDst, &m_vUp );
}
D3DXMATRIX* CCamera::RotateLocalZ( float angle ) // 以local z轴为中心旋转,主要使用这个.
{
D3DXMATRIX matRot;
D3DXMatrixRotationAxis( &matRot, &m_vView, angle );
D3DXVECTOR3 vNewUp;
D3DXVec3TransformCoord( &vNewUp, &m_vUp, &matRot ); // 通过up * rot求得新的 dst vector.
D3DXVec3Normalize( &vNewUp, &vNewUp ); // up vector变为 unit vector...
return SetView( &m_vEye, &m_vLookat, &vNewUp );
}
D3DXMATRIX* CCamera::MoveLocalX( float dist ) // 以local z轴为中心移动,主要使用这个.
{
D3DXVECTOR3 vNewEye = m_vEye;
D3DXVECTOR3 vNewDst = m_vLookat;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vCross );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
return SetView( &vNewEye, &vNewDst, &m_vUp );
}
D3DXMATRIX* CCamera::MoveLocalY( float dist ) // 以local y轴为中心移动,主要使用这个.
{
D3DXVECTOR3 vNewEye = m_vEye;
D3DXVECTOR3 vNewDst = m_vLookat;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vUp );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
return SetView( &vNewEye, &vNewDst, &m_vUp );
}
D3DXMATRIX* CCamera::MoveLocalZ( float dist ) // 以local z轴为中心移动,主要使用这个.
{
D3DXVECTOR3 vNewEye = m_vEye;
D3DXVECTOR3 vNewDst = m_vLookat;
D3DXVECTOR3 vMove;
D3DXVec3Normalize( &vMove, &m_vView );
vMove *= dist;
vNewEye += vMove;
vNewDst += vMove;
return SetView( &vNewEye, &vNewDst, &m_vUp );
}
D3DXMATRIX* CCamera::MoveTo( D3DXVECTOR3* pv )
{
D3DXVECTOR3 dv = *pv - m_vEye;
m_vEye = *pv;
m_vLookat += dv;
return SetView( &m_vEye, &m_vLookat, &m_vUp );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -