JS |如何以弧度旋转?
JS | How to lerp rotation in radians?
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º 旋转 (3.14, 2, 1, 0, -1, -2, -3.14),这并不好。那么,谁能告诉我,如何 lerp 旋转?
我正在使用 JavaScript.
如果结束值小于起始值,则增加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
老实说,我不记得这是怎么回事了。但是,它有效。
它在我的代码中处理播放器对象的渐进旋转以指向鼠标,当指针角度从 -3.14 到 3.14 时,此函数正确地计算间隙的渐进。有,嗯,魔法。
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);
}
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º 旋转 (3.14, 2, 1, 0, -1, -2, -3.14),这并不好。那么,谁能告诉我,如何 lerp 旋转?
我正在使用 JavaScript.
如果结束值小于起始值,则增加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
老实说,我不记得这是怎么回事了。但是,它有效。
它在我的代码中处理播放器对象的渐进旋转以指向鼠标,当指针角度从 -3.14 到 3.14 时,此函数正确地计算间隙的渐进。有,嗯,魔法。
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);
}