处理3D游戏中的横向移动/侧步

7

我很新于游戏开发,成功建模了一个3D地形,并有一个能够在游戏世界中自由移动的相机,不过遇到了一个问题,我无法解决。

目前,我有以下方法来实现向前/向后移动:

void Player::moveForward(const float speed)
{
    Vector3 pos = getPosition();

    float cosYaw = cosf(degreesToRadians(m_yaw));
    float sinYaw = sinf(degreesToRadians(m_yaw));
    pos.x += float(cosYaw)*speed;
    pos.z += float(sinYaw)*speed;

    setPosition(pos);
}

其中Vector3是一个简单的X、Y、Z结构体,而角度转弧度的公式为:

inline float degreesToRadians(const float degrees) {
    const float PIOver180 = 3.14159f / 180.0f;
    return degrees * PIOver180;
}

处理向前移动时,只需将正浮点数放入参数中;向后移动时,放入负浮点数即可。
这使我能够向前和向后移动。通过更改位置的pos.y,我也可以向上移动,但我无法想出如何向左或向右侧步。
xz翻转使我能够侧步,前提是偏航角为360/0、270、180或90。但在它们之间的任何角度会导致相机向前斜步/向后斜步或向前/向后移动。
总之,这一直困扰着我,所以我试图在纸上找到解决方案-这行得通:
inline float degreesToStrafe(const float degrees)
{
    const float PIOver90 = 3.14159f / 90.0f;
    return degrees * PIOver90;
}

然而,在游戏中,这与交换xz的结果完全相同。

非常感谢您的帮助;我很难在网络上找到有关此事的任何信息,但可能是我的搜索方式不正确!

1个回答

6

我认为你不能简单地交换x和z的结果。考虑当cosYaw == sinYaw时的情况:翻转它们将导致与未翻转相同的方向,这显然是不希望发生的行为,因为你试图将向量旋转90度,而不是朝着同一个方向移动。

相反,你需要做的是先将yaw旋转90度,然后执行与MoveForward相同的操作。基本上,你正在将已知的结果速度分解为其x和z分量,你可以这样做是因为你知道角度。如果你考虑前进和横向移动之间的角度差,它是90度,所以只需减去或加上90度到你的yaw,然后使用相同的数学公式。

void Player::strafe(const float speed)
{
    Vector3 pos = getPosition();

    float cosYaw = cosf(degreesToRadians(m_yaw - 90.f));
    float sinYaw = sinf(degreesToRadians(m_yaw - 90.f));
    pos.x += float(cosYaw)*speed;
    pos.z += float(sinYaw)*speed;

    setPosition(pos);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接