Такой вот мутант
векторно-матричный. Код переписан из под DX7.
См. также
здесьАвтор: Снорк
Дата: 28.10.02
.
class CRendererCamera
{
public:
CRendererCamera();
~CRendererCamera();
void Move(FLOAT fLeftRight, FLOAT fUpDown);
void Rotate(FLOAT fLeftRight, FLOAT fUpDown);
void Zoom(FLOAT fZoom);
inline void SetSensetivity(FLOAT fSensetivity)
{
ASSERT(fSensetivity >= 0.0f && fSensetivity <= 1.0f);
m_fSensetivity = fSensetivity;
}
FLOAT GetSensetivity() { return m_fSensetivity; }
protected:
D3DXMATRIX m_matView;
D3DXVECTOR3 m_vecEye, m_vecAt, m_vecUp, m_vecPV;
FLOAT m_fSensetivity;
friend class CRenderer;
};
CRendererCamera::CRendererCamera()
{
m_fSensetivity = 0.5f;
m_vecEye = D3DXVECTOR3(0.0f, 5.0f, 0.0f);
m_vecAt = D3DXVECTOR3(0.0f, 4.0f, 0.0f);
m_vecUp = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
m_vecPV = D3DXVECTOR3(1.0f, 0.0, 0.0);
D3DXMatrixLookAtLH(&m_matView, &m_vecEye, &m_vecAt, &m_vecUp);
}
CRendererCamera::~CRendererCamera()
{
}
void CRendererCamera::Move(FLOAT fLeftRight, FLOAT fUpDown)
{
fLeftRight = - (fLeftRight * m_fSensetivity * CAMERA_MOVE_SENSETIVITY);
fUpDown = fUpDown * m_fSensetivity * CAMERA_MOVE_SENSETIVITY;
m_vecAt.x += m_vecPV.x * fLeftRight;
m_vecAt.y += m_vecPV.y * fLeftRight;
m_vecAt.z += m_vecPV.z * fLeftRight;
m_vecEye.x += m_vecPV.x * fLeftRight;
m_vecEye.y += m_vecPV.y * fLeftRight;
m_vecEye.z += m_vecPV.z * fLeftRight;
m_vecEye.x += m_vecUp.x * fUpDown;
m_vecEye.y += m_vecUp.y * fUpDown;
m_vecEye.z += m_vecUp.z * fUpDown;
m_vecAt.x += m_vecUp.x * fUpDown;
m_vecAt.y += m_vecUp.y * fUpDown;
m_vecAt.z += m_vecUp.z * fUpDown;
D3DXMatrixLookAtLH(&m_matView, &m_vecEye, &m_vecAt, &m_vecUp);
}
void CRendererCamera::Rotate(FLOAT fLeftRight, FLOAT fUpDown)
{
D3DXMATRIX matRotate;
FLOAT fAngle = fLeftRight * m_fSensetivity * CAMERA_ROTATE_SENSETIVITY;
D3DXMatrixRotationAxis(&matRotate, &m_vecUp, fAngle);
D3DXVec3TransformCoord(&m_vecPV, &m_vecPV, &matRotate);
D3DXVec3TransformCoord(&m_vecEye, &m_vecEye, &matRotate);
D3DXVec3TransformCoord(&m_vecAt, &m_vecAt, &matRotate);
fAngle = fUpDown * m_fSensetivity * CAMERA_ROTATE_SENSETIVITY;
D3DXMatrixRotationAxis(&matRotate, &m_vecPV, fAngle);
D3DXVec3TransformCoord(&m_vecUp, &m_vecUp, &matRotate);
D3DXVec3TransformCoord(&m_vecEye, &m_vecEye, &matRotate);
D3DXVec3TransformCoord(&m_vecAt, &m_vecAt, &matRotate);
D3DXMatrixLookAtLH(&m_matView, &m_vecEye, &m_vecAt, &m_vecUp);
}
void CRendererCamera::Zoom(FLOAT fZoom)
{
fZoom = -(fZoom * m_fSensetivity * CAMERA_ZOOM_SENSETIVITY);
D3DXVECTOR3 cam = m_vecEye - m_vecAt;
FLOAT k = (FLOAT) sqrt(cam.x * cam.x + cam.y * cam.y + cam.z * cam.z);
ASSERT(k > 0.0f);
cam.x = cam.x / k;
cam.y = cam.y / k;
cam.z = cam.z / k;
m_vecAt.x += cam.x * fZoom;
m_vecAt.y += cam.y * fZoom;
m_vecAt.z += cam.z * fZoom;
m_vecEye.x += cam.x * fZoom;
m_vecEye.y += cam.y * fZoom;
m_vecEye.z += cam.z * fZoom;
D3DXMatrixLookAtLH(&m_matView, &m_vecEye, &m_vecAt, &m_vecUp);
}