JS |如何抑制弧度旋转?

问题描述

function lerp(start,end,amt) {
    return (1-amt)*start+amt*end
}

此lerp函数与坐标完美配合。我可以轻松地将X从1绑到10。
但是轮换出现问题。物体的旋转以弧度为单位。范围是-3.14至3.14。因此,让我们旋转对象。从0开始,旋转一会儿达到3.14,然后... -3.14。因此,当从3.14延至-3.14时,对象会旋转360度,即旋转一整整360º(3.14、2、1、0,-1,-2,-3.14),这不好。那么,有人可以告诉我如何控制旋转吗?
我正在使用JavaScript。

解决方法

如果最终值小于起始值1,则将其增加2 * Pi,然后进行插值。

将中间值映射到所需范围。

Python代码(JS代码关闭了)

a0 = 3
a1 = - 3
if a1 < a0:
    a1 += 2*math.pi
for i in range(11):
    a = a0 * (1 - i/10) + a1 * i / 10
    if a > math.pi:
        a -= 2*math.pi
    print(a)

3.0
3.028318530717959
3.0566370614359175
3.0849555921538756
3.113274122871834
3.141592653589793
-3.113274122871834
-3.084955592153876
-3.056637061435917
-3.028318530717959
-3.0
,

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

它在我的代码中处理玩家对象指向鼠标的 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);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...