在3D游戏中处理扫射/侧面踩踏

时间:2011-12-15 15:09:17

标签: game-physics

我对游戏开发很陌生并且已成功建模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 个答案:

答案 0 :(得分:6)

我认为你不能只交换x和z结果。考虑cosYaw == sinYaw的情况:翻转它们会产生与未折叠相同的方向,这显然是不需要的行为,因为你试图将向量移动90度,而不是朝同一方向移动。

相反,你想要为MoveForward做同样的事情,先将你的偏航旋转90度。您基本上将已知的合成速度分解为x和z分量,您可以这样做,因为您知道角度。如果你考虑前进和扫射之间的角度差异,它是90度,所以只需减去或增加90度你的偏航然后使用相同的数学。

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);
}