使用Atan2时移动角度

问题描述

我目前正在使用atan2来计算玩家的航向角。

但是,经过反复试验,我发现游戏中的角度与“正常”布局的角度大不相同:

enter image description here

@deployed_skill = @template_skill.becomes!(DeployedSkill).deep_clone include: [:translations]

上面是我用来计算航向角的C#代码。我的问题是如何将这个角度从“正常”角度系统转换为游戏中的角度系统。

解决方法

我认为这是您的情况。您有一个右手坐标系,但是您正在测量一个顺时针角度,这是不一致的。

无论如何,请从360(下方红色)绘制一个小的正角,以形成带有正侧面的直角三角形(下方紫色)。

fig1

要测量三角形的角度θ,请测量短边Δx和长边Δy并进行计算。

var θ = Math.Atan2(Δx,Δy);

这对于两侧的任何正值或负值都适用。例如,如果角度超过90°,则Δy会翻转符号,因为您的目标点将低于原点。但是Atan2()的优点在于您无需担心这些情况,因为只要使它以较小的正角工作,它就可以在所有四个象限中工作。

相反,你有

var Δx = R*Math.Sin(Θ);
var Δy = R*Math.Cos(Θ);

其中R是目标与参考点之间的距离。

,

Math.Atan2(Y2-Y1,X2-X1)从x轴逆时针计算角度。 Math.Atan2(X2-X1,Y2-Y1)从y轴顺时针计算角度,这就是您想要的。

“从北方顺时针”约定在导航和地图绘制中使用。多年以来,我发现最容易想到的是具有北,东分量的向量。这意味着atan2的调用方式相同,即从p获取q的方向:

dirn = atan2( q[1]-p[1],q[0]-p[0]);

如果将p和q视为x,y向量,则可以从x轴逆时针旋转角度。如果您将p和q视为n,e向量,它会为您提供从北向右的角度。

这也意味着旋转矩阵的公式相同。要旋转角度a,请使用矩阵

R = ( cos(a)  -sin(a) )
    ( sin(a)   cos(a) )

同样,如果您认为向量为x,y,则应用R旋转并从轴逆时针旋转角度a,而如果您认为向量为n,则应用R旋转角度为角度。 a,从北方顺时针旋转。