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

Math 在2D中相对于摄影机方向移动的计算是什么?,math,language-agnostic,Math,Language Agnostic,根据按下四个WASD键中的哪一个键,如何以弧度表示相机所面对的水平方向?W向前,A向左,S向后,D向右 如果说在Minecraft中,按W键让你向北走,而不是朝着哪个方向走,那会很烦人 const signed char Z=wkeyspressed skeypressed,X=dkeyspressed akeypressed; if(Z | | X){ 常量浮动方向=((水平视角弧度-(Z-1)*M_π/2)*(Z!=0)+(水平视角弧度-X*M_π/2)*(X!=0))/(Z&&X)+1+(

根据按下四个WASD键中的哪一个键,如何以弧度表示相机所面对的水平方向?W向前,A向左,S向后,D向右

如果说在Minecraft中,按W键让你向北走,而不是朝着哪个方向走,那会很烦人

const signed char Z=wkeyspressed skeypressed,X=dkeyspressed akeypressed;
if(Z | | X){
常量浮动方向=((水平视角弧度-(Z-1)*M_π/2)*(Z!=0)+(水平视角弧度-X*M_π/2)*(X!=0))/(Z&&X)+1+(X==1&&Z=-1)*(浮动)M_π,速度=0.0625F;
XLocation-=sinf(方向)*速度;
Z位置+=cosf(方向)*速度;
}

好的,从你的回答来看,你似乎已经掌握了你需要做什么。但是,为了其他从未做过这件事的人,我将从基础开始

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

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

为此,您必须了解正弦和余弦是如何与圆和角度相互作用的

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

余弦的作用与此相同,但它不是测量到X轴的距离,而是测量到Y轴的距离

(sin=红色,cos=绿色)

您可以在这里看到,随着方向向北靠近,红色线将增大,而绿色线将缩小。这就是我们想要的。如果我们正对着北方,我们根本不想向东或向西移动。 我们向右拐得越远,绿线越长。使我们更向东移动

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

请注意,sin和cos返回一个介于-11之间的值,因此要使玩家移动得更快,请将结果值乘以玩家的速度

代码 要向前移动

moveForward(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;
}
(如果我们正在进行2D游戏,我们将移动X而不是Z,移动Y而不是X

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

(注意我们如何在两个轴上进行减法,这是因为如果我们面向东北方向-并且我们向后走-我们会想向西南方向移动。)

对于向右移动

moveForward(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;
}
用于向左移动

moveForward(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;
}
给你!我们现在可以根据输入角度确定任何运动矢量

注意事项: 确保您知道您正在使用的角度测量。在大多数情况下,它将处于,所以不要尝试使用度,除非这是您的sin/cos函数所期望的


确保您也知道坐标系的“”。例如,在某些环境中,Y轴向前/向后。并且Z轴是向上和向下的。或者东方是负的,而西方是正的,这取决于你的相机表现,如果它是矩阵,那么你只需要使用它的基向量。。。看见