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