相对于相机方向在 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 度角?如果他们面向东北呢?
要做到这一点,您必须了解 sine 和 cosine 如何与圆和角相互作用。
Sine 获取一个角度并在圆上画出一个点。然后测量从该点到 X 轴.
的距离
Cosine 做同样的事情,但不是测量到 X 轴的距离,而是测量到 Y 轴.
(sin = 红色, cos = 绿色)
您可以在这里看到,随着方向接近北方,红色线会变大,而绿色线会缩小。这就是我们想要的。如果我们直接面向北方,我们根本不想向东或向西移动。
我们越往右转,绿线越延伸。使我们更多地向东移动。
如果我们可以确定我们所面对的角度,我们就可以确定我们想要在每个轴上移动玩家多少。
请注意 sin 和 cos return 介于 -1 和 1 之间的值,因此要让玩家移动得更快即,将结果值乘以玩家的速度。
代码
向前移动:
moveForward(direction) {
z += cos(direction) * playerSpeed;
x += sin(direction) * playerSpeed;
}
(如果我们正在开发 2D 游戏,我们会移动 X 而不是 Z 和 Y 而不是 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.
如何根据按下四个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 度角?如果他们面向东北呢?
要做到这一点,您必须了解 sine 和 cosine 如何与圆和角相互作用。
Sine 获取一个角度并在圆上画出一个点。然后测量从该点到 X 轴.
的距离Cosine 做同样的事情,但不是测量到 X 轴的距离,而是测量到 Y 轴.
(sin = 红色, cos = 绿色)
您可以在这里看到,随着方向接近北方,红色线会变大,而绿色线会缩小。这就是我们想要的。如果我们直接面向北方,我们根本不想向东或向西移动。 我们越往右转,绿线越延伸。使我们更多地向东移动。
如果我们可以确定我们所面对的角度,我们就可以确定我们想要在每个轴上移动玩家多少。
请注意 sin 和 cos return 介于 -1 和 1 之间的值,因此要让玩家移动得更快即,将结果值乘以玩家的速度。
代码
向前移动:
moveForward(direction) {
z += cos(direction) * playerSpeed;
x += sin(direction) * playerSpeed;
}
(如果我们正在开发 2D 游戏,我们会移动 X 而不是 Z 和 Y 而不是 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.