问题描述
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);
}