Камера DirectX8
От: Снорк  
Дата: 29.10.02 07:32
Оценка:
Такой вот мутант векторно-матричный. Код переписан из под 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.