如何旋转DirectX11 FPS游戏摄像机?

如何旋转DirectX11 FPS游戏摄像机?,directx,directx-11,frame-rate,Directx,Directx 11,Frame Rate,看那个视频 我的问题是左、右旋转效果很好,但上、下旋转效果不好,请看视频。我猜是轴的问题 那是我的消息来源 炮弹目标源 //鳞片 摄像机视图矩阵源 XMVECTOR vRight = XMLoadFloat3(&m_vRight); XMVECTOR vUp = XMLoadFloat3(&m_vUp); XMVECTOR vLook = XMLoadFloat3(&m_vLook); XMVECTOR vPosition

看那个视频

我的问题是左、右旋转效果很好,但上、下旋转效果不好,请看视频。我猜是轴的问题

那是我的消息来源

炮弹目标源 //鳞片

摄像机视图矩阵源

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

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

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

    // 뷰행렬의 내용물을 설정한다.
    XMStoreFloat3(&m_vRight, vRight);
    XMStoreFloat3(&m_vUp, vUp);
    XMStoreFloat3(&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(&m_vPosition);

    XMFLOAT4X4 tempTranslateMatrix;
    XMStoreFloat4x4(&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(&m_f4x4View);
    tempView *= XMLoadFloat4x4(&tempTranslateMatrix);
    XMStoreFloat4x4(&m_f4x4View, tempView);

看视频,问题似乎出在枪码上。因为枪应该总是在同一屏幕位置,你可以简单地渲染它,而不应用相机旋转,我认为。上下旋转现在工作了吗?现在这是一个狡猾的问题@bigthewar看起来偏航和俯仰旋转工作正常。你的问题是什么?
XMVECTOR vRight    = XMLoadFloat3(&m_vRight);
    XMVECTOR vUp       = XMLoadFloat3(&m_vUp);
    XMVECTOR vLook     = XMLoadFloat3(&m_vLook);
    XMVECTOR vPosition = XMLoadFloat3(&m_vPosition);

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

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

    // 뷰행렬의 내용물을 설정한다.
    XMStoreFloat3(&m_vRight, vRight);
    XMStoreFloat3(&m_vUp, vUp);
    XMStoreFloat3(&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(&m_vPosition);

    XMFLOAT4X4 tempTranslateMatrix;
    XMStoreFloat4x4(&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(&m_f4x4View);
    tempView *= XMLoadFloat4x4(&tempTranslateMatrix);
    XMStoreFloat4x4(&m_f4x4View, tempView);