相对于相机方向在 2D 中移动的计算是什么?

What are the calculations to move in 2D relative to the camera direction?

如何根据按下四个WASD键中的哪一个来以弧度为单位在相机面向的水平方向上移动? W向前,A向左,S向后,D向右

如果在 Minecraft 中,按 W 让你向北走,而不是你面对的任何方向,那会很烦人

思路是这样的

const signed char Z = WKeyIsPressed-SKeyIsPressed, X = DKeyIsPressed-AKeyIsPressed;
if (Z || X) {
    const float Direction = ((HorizontalViewAngleRadians-(Z-1)*M_PI/2)*(Z != 0)+(HorizontalViewAngleRadians-X*M_PI/2)*(X != 0))/((Z&&X)+1)+(X == 1 && Z == -1)*(float)M_PI, Speed = 0.0625F;
    XLocation -= sinf(Direction)*Speed;
    ZLocation += cosf(Direction)*Speed;
}

好的,从你的回答看来你已经掌握了你需要做什么。但是为了以前从未这样做过的其他人来到这里,我将从基础开始。

数学

假设你有一个想要前进的球员。他们本能地知道按“向前”可以让他们朝相机的方向移动。

然而,在设计游戏时,它不仅仅是在一个轴上递增一个值那么简单。如果他们转身怎么办?是否呈 90 度角?如果他们面向东北呢?

要做到这一点,您必须了解 sinecosine 如何与圆和角相互作用。

Sine 获取一个角度并在圆上画出一个点。然后测量从该点到 X 轴.

的距离

Cosine 做同样的事情,但不是测量到 X 轴的距离,而是测量到 Y 轴.

(sin = 红色, cos = 绿色)

您可以在这里看到,随着方向接近北方,红色线会变大,而绿色线会缩小。这就是我们想要的。如果我们直接面向北方,我们根本不想向东或向西移动。 我们越往右转,绿线越延伸。使我们更多地向东移动。

如果我们可以确定我们所面对的角度,我们就可以确定我们想要在每个轴上移动玩家多少。

请注意 sin 和 cos return 介于 -11 之间的值,因此要让玩家移动得更快即,将结果值乘以玩家的速度。

代码

向前移动:

moveForward(direction) {
    z += cos(direction) * playerSpeed;
    x += sin(direction) * playerSpeed;
}

(如果我们正在开发 2D 游戏,我们会移动 X 而不是 ZY 而不是 X)

既然我们知道如何向前移动,向后移动 就很简单了(没有双关语意)。

moveBackward(direction) {
    z -= cos(direction) * playerSpeed;
    x -= sin(direction) * playerSpeed;
}

(注意我们如何在 两个 轴上减去,这是因为如果我们面向东北 - 我们正在向后走 - 我们想要向南移动-西.)

向右移动:

moveRight(direction) {
    z -= cos(direction) * playerSpeed;
    x += sin(direction) * playerSpeed;
}

向左移动:

moveLeft(direction) {
    z += cos(direction) * playerSpeed;
    x -= sin(direction) * playerSpeed;
}

给你!我们现在可以根据输入角度确定任何运动矢量!

注意事项:

确保您知道您使用的是什么角度测量。在大多数情况下,它会在 radians 中,所以不要尝试使用度数,除非那是你的 sin/cos 函数所期望的。

确保您也知道坐标系的“handedness”。例如在某些环境中 Y 轴 是 forward/back。而Z轴上下。或者东是 X,西是 X.