JS | 如何以弧度为单位旋转?

Ani*_*eMe 2 javascript math rotation radians lerp

function lerp(start, end, amt) {\n    return (1-amt)*start+amt*end\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这个 lerp 函数与坐标完美配合。我可以轻松地将 X 从 1 调整到 10。
\n但是当涉及到旋转时就会出现问题。物体的旋转以弧度为单位。它可以是从 -3.14 到 3.14。那么让我们旋转我们的对象。从0开始,某一时刻旋转会达到3.14,然后...-3.14。因此,当从 3.14 到 -3.14 进行 lerping 时,对象会进行一次完整的 360\xc2\xba 旋转,(3.14, 2, 1, 0, -1, -2, -3.14),这不好。那么,有人能告诉我如何调整轮换吗?
\n我正在使用 JavaScript。

\n

小智 6

老实说,我不记得这是如何运作的。但是,它有效。

在我的代码中,它用于处理玩家对象的 lerping 旋转以指向鼠标,当指针角度穿过 -3.14 到 3.14 时,此函数可以正确计算跨越间隙的 lerp。带着,嗯,魔法。

function rLerp (A, B, w){
    let CS = (1-w)*Math.cos(A) + w*Math.cos(B);
    let SN = (1-w)*Math.sin(A) + w*Math.sin(B);
    return Math.atan2(SN,CS);
}
Run Code Online (Sandbox Code Playgroud)

  • 我想为任何回来的人添加更多信息。我有点想了解为什么/如何工作,而且,我发现对于最初提出这个的人来说它非常聪明。实际上,A(源角度)和 B(目标角度)使用 cos/sin 转换为 X/Y 偏移,就像将角度转换为单位向量一样。然后,不是直接对角度进行线性化,而是对该单位向量进行线性化,并使用 atan2 将其转换回角度。例如,对于 SN,它实际上是“xOffsetAfterLerp = lerp(sin(angleFrom), sin(angleTo), alpha)”,而 CS 是 yOffset (cos)。 (2认同)