C ++ DirectX 11 - камера от третьего лица

0

Я пытаюсь установить камеру третьего лица, но я потерялся с поворотами. Мое вращение работает для оси Y, но другие странят странно. Это мой код:

XMMATRIX Camera2::Render()
{
    return XMMatrixLookAtLH( XMLoadFloat3( &m_vPosition ), XMLoadFloat3( &m_vTargetPos     ), XMLoadFloat3( &( XMFLOAT3( 0.0f, 1.0f, 0.0f ) ) ) );
}

void Camera2::Rotate( float fAngle, int nAxe )
{
    float fToRad = 0.0174532925f;
    fAngle *= fToRad;

    if( nAxe == 0 )
    {
        XMFLOAT3 vPosition = m_vPosition;
        m_vPosition.y = vPosition.y * cos( fAngle ) - vPosition.z * sin( fAngle );
        m_vPosition.z = vPosition.y * sin( fAngle ) + vPosition.z * cos( fAngle );
    }
    else if( nAxe == 1 )
    {
        XMFLOAT3 vPosition = m_vPosition;
        m_vPosition.z = vPosition.z * cos( fAngle ) - vPosition.x * sin( fAngle );
        m_vPosition.x = vPosition.z * sin( fAngle ) + vPosition.x * cos( fAngle );
    }
    else if( nAxe == 2 )
    {
    XMFLOAT3 vPosition = m_vPosition;
    m_vPosition.x = vPosition.x * cos( fAngle ) - vPosition.y * sin( fAngle );
    m_vPosition.y = vPosition.x * sin( fAngle ) + vPosition.y * cos( fAngle );
    }
}

И код, вызывающий функции камеры (x = 0, y = 1, z = 2):

if( event.IsPushedKey( VK_F1 ) )
    m_pCamera->Rotate( -3.0f, 0 );
else if( event.IsPushedKey( VK_F2 ) )
    m_pCamera->Rotate( -3.0f, 1 );
else if( event.IsPushedKey( VK_F3 ) )
    m_pCamera->Rotate( -3.0f, 2 );
else if( event.IsPushedKey( VK_F4 ) )
    m_pCamera->Rotate( 3.0f, 0 );
else if( event.IsPushedKey( VK_F5 ) )
    m_pCamera->Rotate( 3.0f, 1 );
else if( event.IsPushedKey( VK_F6 ) )
    m_pCamera->Rotate( 3.0f, 2 );

Другой вопрос: когда я начинаю с XMFLOAT3 (0.0f, 0.0f, 0.0f) как переменную lookAt и имеет позицию x и y, равную 0, ничего не получается. Мне нужно установить один из томов lookAt в 1.0f, чтобы что-то увидеть. Зачем?

Теги:
camera
directx

2 ответа

0
Лучший ответ

Ваша матрица вращения была неправильной для вращения вокруг оси Y и оси Z, вот матрица.

Вращение вокруг оси X тета (в радиусе)

Изображение 174551

Вращение вокруг оси Y тета (в радиусе)

Изображение 174551

Вращение вокруг оси Z по тета (в радиусе)

Изображение 174551

0

Представьте себе реальный мир.

Что происходит, когда вы пытаетесь сосредоточиться на своем собственном глазу?

Это невозможно.

  • 0
    Да, это то, что я понял, когда у меня было исключение, потому что lookAt и позиция были равны. Но когда у меня z равно 10 и ничего больше, я ничего не вижу. У меня есть что-то новое об этом, если мой вектор вверх у, моя позиция камеры не может иметь х и Z, равные нулю. Если мой вектор роста z равен 1,0f, то у меня должен быть другой переменный, отличный от z, который не равен 0,0f.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню