如何按照朝向的方向正确移动相机

And*_*ndy 4 c++ camera direct3d rotation

我试图弄清楚如何使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;
 }
Run Code Online (Sandbox Code Playgroud)

重要部分是位置最后更新的位置。

到目前为止,我只能推断出我的数学技能很差。

那么,有人可以帮助我解决这一难题吗?我创建了一个小提琴来帮助测试数学。

编辑:小提琴使用与我在MoveForward函数中使用的数学运算相同的数学运算,如果将音调设置为90,则可以看到Z轴仍在修改中

And*_*ndy 6

感谢Chaosed0的回答,我得以找出正确的公式来计算特定方向的运动。

下面的固定代码与上面的固定代码基本相同,但现在进行了简化和扩展,使其更易于理解。


首先,我们确定相机移动的量,在我的情况下为m_forwardSpeed,但在这里我将其定义为偏移量。

float offset = 1.0f;
Run Code Online (Sandbox Code Playgroud)

接下来,您将需要获取相机的X和Y旋转值(以度为单位!)

float pitch = camera_rotationX;
float yaw   = camera_rotationY;
Run Code Online (Sandbox Code Playgroud)

然后我们将这些值转换为弧度

float pitchRadian = pitch * (PI / 180); // X rotation
float yawRadian   = yaw   * (PI / 180); // Y rotation
Run Code Online (Sandbox Code Playgroud)

现在,我们在这里确定新位置:

float newPosX = offset *  sinf( yawRadian ) * cosf( pitchRadian );
float newPosY = offset * -sinf( pitchRadian );
float newPosZ = offset *  cosf( yawRadian ) * cosf( pitchRadian );
Run Code Online (Sandbox Code Playgroud)

请注意,我们仅将X和Z位置乘以pitchRadian的余弦,这可以抵消当您的相机偏航方向为向上(90)或向下(-90)时方向的偏移量。

最后,您需要告诉相机新的位置,我将不介绍它的新位置,因为它在很大程度上取决于您实现相机的方式。显然,这种方式是不合常理的,并且可能效率很低。但是,正如Chaosed0所说,这对我来说最有意义!