Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;DirectX11中的第三人称照相机_C++_Camera_Directx 11 - Fatal编程技术网

C++ C++;DirectX11中的第三人称照相机

C++ C++;DirectX11中的第三人称照相机,c++,camera,directx-11,C++,Camera,Directx 11,基本上,我想让我的相机漂浮在一个角色(aCar)的后面,当它转向时保持在它的后面,这样它就一直漂浮在角色的后面,目前我有一个和我的角色转向相同方向的相机,但我似乎根本无法让它相对于他们面对的方向保持在后面 我在这里找到了一个教程 但这使用了XMVECTORs,这是非常不合作的,除此之外,还不清楚一些函数在数学上实际做了什么 不用多说,下面是我的代码,它与相机和它要跟随的对象有关 更新方法 XMFLOAT3 relativeMovement; if (GetAsyncKeyState(0x57))

基本上,我想让我的相机漂浮在一个角色(aCar)的后面,当它转向时保持在它的后面,这样它就一直漂浮在角色的后面,目前我有一个和我的角色转向相同方向的相机,但我似乎根本无法让它相对于他们面对的方向保持在后面

我在这里找到了一个教程 但这使用了XMVECTORs,这是非常不合作的,除此之外,还不清楚一些函数在数学上实际做了什么

不用多说,下面是我的代码,它与相机和它要跟随的对象有关

更新方法

XMFLOAT3 relativeMovement;
if (GetAsyncKeyState(0x57)) //W key press
{

    relativeVectorCalc(0, true); 
}
if (GetAsyncKeyState(0x53)) // S Key Press
{

    relativeVectorCalc(1, true);
}
if (GetAsyncKeyState(0x41)) //A Key Press
{
    relativeVectorCalc(3, true);
}
if (GetAsyncKeyState(0x44)) //D Key Press
{
    relativeVectorCalc(2, true);
}

if (GetAsyncKeyState(0x45)) //E Key Press
{
    CameraRotate(1);
    //relativeVectorCalc(2, false);
    aCar.at(0)->setWorld({ 1.0f, 1.0f, 1.0f }, aCar.at(0)->getPos(), 0.0f, 0.001f, 0.0f);
} else if(GetAsyncKeyState(0x51)) //Q Key Press
{
    CameraRotate(0);
    //relativeVectorCalc(3, false);
    aCar.at(0)->setWorld({ 1.0f, 1.0f, 1.0f }, aCar.at(0)->getPos(), 0.0f, -0.001f, 0.0f);
}



cam->CalculateViewProjection();

void Application::relativeVectorCalc(int k, bool P)
{

    XMFLOAT3 relativeMovement;
    XMFLOAT4 camAt = cam->GetAt();
    XMFLOAT4 camEye = cam->GetEye();

    //Finds the direction the player is facing and moves relative to that based on the key the    player pressed
    if (k == 0)
    {
        relativeMovement.x = (camAt.x - camEye.x); //Calculates the distance between the camera's center and its eye
        relativeMovement.y = 0.0f;
        relativeMovement.z = (camAt.z - camEye.z); //See above
    }
    else if (k == 1)
    {
        relativeMovement.x = 0 - (camAt.x - camEye.x);
        relativeMovement.y = 0.0f;
        relativeMovement.z = 0 - (camAt.z - camEye.z);
    }
    else if (k == 2)
    {
        relativeMovement.x = (camAt.z - camEye.z);
        relativeMovement.y = 0.0f;
        relativeMovement.z = 0 - (camAt.x - camEye.x);
    }
    else if (k == 3)
    {
        relativeMovement.x = 0 - (camAt.z - camEye.z);
        relativeMovement.y = 0.0f;
        relativeMovement.z = (camAt.x - camEye.x);
    }
    relativeMovement = (relativeMovement); //Makes the vector normalised

    //Here is where the speed of the movement is controlled via division
    relativeMovement.x = relativeMovement.x / 100; //slows down movement
    relativeMovement.z = relativeMovement.z / 100;

    if (P)
    {
        PlayerMove(relativeMovement);
        CameraMove(relativeMovement);
    }
    else if (!P)
    {
        CameraMove(relativeMovement);
    }

 }



 void Application::CameraMove(XMFLOAT3 straightMovementVector)
 {
XMFLOAT4 cameraEye = cam->GetEye();
XMFLOAT4 cameraAt = cam->GetAt();
cameraEye.x = cameraEye.x + straightMovementVector.x;
cameraEye.z = cameraEye.z + straightMovementVector.z;
cameraAt.x = cameraAt.x + straightMovementVector.x;
cameraAt.z = cameraAt.z + straightMovementVector.z;
cameraAt.y = aCar.at(0)->getPos().y + 3.0f;
cam->SetEye(cameraEye);
cam->SetAt(cameraAt);

 }



 void Application::PlayerMove(XMFLOAT3 move)
 {
    XMFLOAT3 p = aCar.at(0)->getPos();
    p.x = p.x + move.x;
    p.z = p.z + move.z;
    aCar.at(0)->setPos(p);
 }




 void Application::CameraRotate(int x)
 {
XMFLOAT4 camAt = cam->GetAt();
XMFLOAT4 camEye = cam->GetEye();
XMFLOAT3 carPos = aCar.at(0)->getPos();

XMFLOAT2 dist = { carPos.x - camEye.x, carPos.z - camEye.z };

    if (x == 0)
    {
        camRotation += 0.001f;
        camAt.x = cos(camRotation) + camEye.x;
        camAt.z = sin(camRotation) + camEye.z;

    } else if (x == 1)
    {
        camRotation -= 0.001f;
        camAt.x = cos(camRotation) + camEye.x;
        camAt.z = sin(camRotation) + camEye.z;
    }
    cam->SetEye(camEye);
    cam->SetAt(camAt);
 }

任何帮助都将不胜感激,谢谢

如果您觉得DirectXMath的对齐需求模型
XMVECTOR
XMMATRIX
太令人沮丧,请尝试在中使用包装器。啊,谢谢,使用SimpleMath我能够绕过那些恼人的访问冲突错误,并最终为自己准备了一台相机来使用该教程,非常感谢!SimpleMath的优点是它很简单。。。它与DirectXMath库的其余部分进行了简单的互操作,因此您可以慢慢地按照您理解的方式使用它。只是一个友好的提醒,您可以使用如下字符形式:GetAsyncKeyState('W'),或者如果您需要一个特殊的键,如enter,您只需将字符与VK_KEYNAME交换即可