Как повернуть игровую камеру DirectX11 кадров в секунду?

#directx #directx-11 #frame-rate

#directx #directx-11 #частота кадров

Вопрос:

http://www.youtube.com/watch?v=M8A1H7xWJcIamp;feature=youtu.be

посмотрите это видео.

Моя проблема в том, что поворот влево, вправо работает хорошо, но поворот вверх, вниз не работает должным образом (см. Видео). Я думаю, проблема с осью

Это мой источник

Источник объекта GunObject // Масштаб

 XMMATRIX matScale = XMMatrixIdentity();
    matScale = XMMatrixScaling(m_Scaling.x, m_Scaling.y, m_Scaling.z);

    // rotation
    XMMATRIX matRoation = XMMatrixIdentity();
    matRoation *= XMMatrixRotationNormal(XMLoadFloat3(amp;XMFLOAT3(0.0f, 1.0f, 0.0f)), m_fRotAngleY);
    matRoation *= XMMatrixRotationNormal(XMLoadFloat3(amp;vRight), m_fRotAngleX);

    // Translate
    XMMATRIX matTranslate = XMMatrixIdentity();
    matTranslate = XMMatrixTranslation(m_Pos.x, m_Pos.y, m_Pos.z);

    XMMATRIX matWorld = XMMatrixIdentity();
    matWorld = matScale * matRoation * matTranslate;

    XMStoreFloat4x4(amp;m_f4x4World, matWorld);
    XMStoreFloat4x4(amp;m_f4x4ViewProj, matViewProj);
    XMStoreFloat4x4(amp;m_f4x4WorldViewProj, matWorld * matViewProj);
  

Просмотр матрицы FPSCamera Source

 XMVECTOR vRight    = XMLoadFloat3(amp;m_vRight);
    XMVECTOR vUp       = XMLoadFloat3(amp;m_vUp);
    XMVECTOR vLook     = XMLoadFloat3(amp;m_vLook);
    XMVECTOR vPosition = XMLoadFloat3(amp;m_vPosition);

    // 룩벡터와 업벡터, 횡벡터를 정규직교화 한다.
    vLook = XMVector3Normalize(vLook);
    vUp   = XMVector3Normalize( XMVector3Cross(vLook, vRight) );

    // 룩벡터와 업벡터는 이미 정규화과 되어 있으므로 횡벡터를 정규화 할 필요가 없다.
    vRight = XMVector3Cross(vUp, vLook);
    vRight = XMVector3Normalize(vRight);

    // 뷰행렬의 내용물을 설정한다.
    XMStoreFloat3(amp;m_vRight, vRight);
    XMStoreFloat3(amp;m_vUp, vUp);
    XMStoreFloat3(amp;m_vLook, vLook);

    m_f4x4View(0, 0) = m_vRight.x;
    m_f4x4View(1, 0) = m_vRight.y;
    m_f4x4View(2, 0) = m_vRight.z;
    m_f4x4View(3, 0) = -m_fOffsetX;
    //m_f4x4View(3, 0) = -XMVectorGetX(XMVector3Dot(vPosition, vRight));

    m_f4x4View(0, 1) = m_vUp.x;
    m_f4x4View(1, 1) = m_vUp.y;
    m_f4x4View(2, 1) = m_vUp.z;
    m_f4x4View(3, 1) = -XMVectorGetX(XMVector3Dot(vPosition, vUp));

    m_f4x4View(0, 2) = m_vLook.x;
    m_f4x4View(1, 2) = m_vLook.y;
    m_f4x4View(2, 2) = m_vLook.z;
    m_f4x4View(3, 2) = -m_fOffsetZ;

    m_f4x4View(0, 3) = 0.0f;
    m_f4x4View(1, 3) = 0.0f;
    m_f4x4View(2, 3) = 0.0f;
    m_f4x4View(3, 3) = 1.0f;

    m_vPosition.x -= m_fOffsetX;
    m_vPosition.z -= m_fOffsetZ;
    vPosition = XMLoadFloat3(amp;m_vPosition);

    XMFLOAT4X4 tempTranslateMatrix;
    XMStoreFloat4x4(amp;tempTranslateMatrix, XMMatrixIdentity());
    tempTranslateMatrix(3, 0) = -XMVectorGetX(XMVector3Dot(vPosition, vRight));
    tempTranslateMatrix(3, 1) = 0.0f;
    tempTranslateMatrix(3, 2) = -XMVectorGetX(XMVector3Dot(vPosition, vLook));;
    tempTranslateMatrix(3, 3) = 1.0f;

    XMMATRIX tempView = XMLoadFloat4x4(amp;m_f4x4View);
    tempView *= XMLoadFloat4x4(amp;tempTranslateMatrix);
    XMStoreFloat4x4(amp;m_f4x4View, tempView);
  

Комментарии:

1. Глядя на видео, кажется, что проблема в коде gun. Поскольку пистолет всегда должен находиться в одном и том же положении на экране, я думаю, вы могли бы просто отобразить его, вообще не применяя поворот камеры.

2. up, down rotation is now worked ? Вот это какая-то коварная проблема!

3. @bigthewar Похоже, что поворот по рысканию и тангажу работает нормально. В чем ваш вопрос?