我试图弄清楚如何让 Directx 中的相机根据它所面对的方向移动。
现在我移动相机的方式是将相机的当前位置和旋转传递给一个名为 PositionClass 的类。PositionClass 从另一个名为 InputClass 的类中获取键盘输入,然后更新相机的位置和旋转值,然后将其传递回相机类。
我编写了一些似乎对我有用的代码,使用相机俯仰和偏航,我可以让它朝着我指向相机的方向前进。
但是,当相机直视向上(俯仰=90)或直视向下(俯仰=-90)时,它仍然会改变相机的 X 和 Z 位置(取决于偏航)。
预期的行为是在向上或向下直视时,它只会沿 Y 轴移动,而不是沿 X 或 Z 轴移动。
这是计算新相机位置的代码
void PositionClass::MoveForward(bool keydown)
{
float radiansY, radiansX;
// Update the forward speed movement based on the frame time
// and whether the user is holding the key down or not.
if(keydown)
{
m_forwardSpeed += m_frameTime * m_acceleration;
if(m_forwardSpeed > (m_frameTime * m_maxSpeed))
{
m_forwardSpeed = m_frameTime * m_maxSpeed;
}
}
else
{
m_forwardSpeed -= m_frameTime * m_friction;
if(m_forwardSpeed < 0.0f)
{
m_forwardSpeed = 0.0f;
}
}
// ToRadians() just multiplies degrees by 0.0174532925f
radiansY = ToRadians(m_rotationY); //yaw
radiansX = ToRadians(m_rotationX); //pitch
// Update the position.
m_positionX += sinf(radiansY) * m_forwardSpeed;
m_positionY += -sinf(radiansX) * m_forwardSpeed;
m_positionZ += cosf(radiansY) * m_forwardSpeed;
return;
}
重要的部分是最后更新位置的位置。
到目前为止,我只能推断出我的数学技能很糟糕。
那么,任何人都可以帮助我解决这个难题吗?我创建了一个小提琴来帮助测试数学。
编辑:小提琴使用我在 MoveForward 函数中使用的相同数学,如果您将音高设置为 90,您可以看到 Z 轴仍在修改