C++ c++;DirectX 11-第三人称照相机

C++ c++;DirectX 11-第三人称照相机,c++,camera,directx,C++,Camera,Directx,我试图设置一个第三人称摄影机,但我无法旋转。我的旋转方向是Y轴,但其他方向的移动很奇怪。这是我的代码: XMMATRIX Camera2::Render() { return XMMatrixLookAtLH( XMLoadFloat3( &m_vPosition ), XMLoadFloat3( &m_vTargetPos ), XMLoadFloat3( &( XMFLOAT3( 0.0f, 1.0f, 0.0f ) ) ) ); } void Ca

我试图设置一个第三人称摄影机,但我无法旋转。我的旋转方向是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):


另一个问题:当我以XMFLOAT3(0.0f,0.0f,0.0f)作为lookAt变量开始,并且x和y位置等于0时,什么都不画。我需要将“注视之斧”的一个设定为1.0f才能看到一些东西。为什么?

想象一下现实世界

当你试着专注于自己的眼睛时会发生什么


这是不可能的。

您的旋转矩阵绕Y轴和Z轴旋转是错误的,这是矩阵

围绕X轴旋转θ(弧度)

围绕Y轴旋转θ(弧度)

围绕Z轴旋转θ(弧度)


是的,当我遇到一个例外时,我意识到这一点,因为注视和位置是相等的。但是当z等于10,其他什么都看不到的时候,我什么也看不到。我有一些新的东西,如果我的上方向向量是y,我的相机位置不能让x和z等于零。如果我的上向量z等于1.0f,那么我必须有另一个不等于0.0f的变量。
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 );