【问题标题】:What are the calculations to move in 2D relative to the camera direction?相对于相机方向在 2D 中移动的计算是什么?
【发布时间】:2021-03-08 21:11:08
【问题描述】:

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

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

【问题讨论】:

标签: math language-agnostic


【解决方案1】:

好的,从您的回答看来,您似乎已经掌握了您需要做什么。但是为了其他从来没有这样做过的人来这里,我将从基础开始。

数学

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

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

为此,您必须了解 sinecosine 如何与圆和角相互作用。

正弦 取一个角度并在圆上绘制一个点。然后它会测量从该点到 X 轴的距离。

余弦也是如此,但不是测量到 X 轴的距离,而是测量到 Y 轴的距离。

(sin = 红色,cos = 绿色)

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

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

请注意,sin 和 cos 返回的值介于 -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 轴 是前进/后退。 Z 轴 上下。或者东是 X,西是 X。

【讨论】:

    【解决方案2】:

    想法是这样的。

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

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多