javascript - JS CANVAS - 到达目标位置时圆圈速度减慢

标签 javascript canvas interpolation

我试图让一个圆形物体移动到位置,但每当它靠近球位置时,无论它开始移动到哪里,它都会减慢速度。我似乎无法让它以恒定速度移动而不减慢速度。

我使用 lerp 进行线性插值,并直接在我的移动函数中使用它。

function lerp(v0, v1, t) {
    return v0 * (1 - t) + v1 * t;
};

FPS = 60;

function Objects(/*parameters*/){
    this.pos = new Vector2D(x, y);

    this.move = function(x, y){
      this.pos.x = lerp(this.pos.x, x, FPS/1000);
      this.pos.y = lerp(this.pos.y, y, FPS/1000);
    };
};

function update(){
    //Move object to ball position
    SuperObject.move(ball.pos.x, ball.pos.y);
    drawObjects();
    setTimeout(update, 1000/FPS);
};

演示链接:http://codepen.io/knoxgon/pen/EWVyzv

最佳答案

这是预期的行为。当您通过从当前位置到目标进行线性插值来设置位置时,它定义了一个收敛级数。

让我们看一个更简单的示例:假设您只有一维,圆最初位于 x(0)=10 处,目标位于 tx=0 处。您可以通过以下方式定义每个步骤:x(n+1) = lerp(x(n), tx, 0.1) = 0.9 * x(n) + 0.1 * tx = 0.9 * x(n) (0.9为了简单起见)。因此级数变为x(0) = 10, x(1) = 9, x(2) = 8.1, x(n) = 10 * pow(0.9, n),这是一个收敛的几何级数,并且永远不会描述匀速运动。

你必须改变你的方程:

move(x, y) {
    let deltax = x - this.pos.x;
    let deltay = y - this.pos.y;
    const deltaLength = Math.sqrt(deltax * deltax + deltay * deltay);
    const speed = 10;
    if (deltaLength > speed) {
        deltax = speed * deltax / deltaLength;
        deltay = speed * deltay / deltaLength;
    }
    this.pos.x += deltax;
    this.pos.y += deltay;
}

http://codepen.io/anon/pen/LWpRWJ

关于javascript - JS CANVAS - 到达目标位置时圆圈速度减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504704/

相关文章:

javascript - 添加另一个类后,jQuery 不再为每个类找到 dom

javascript - 单击 html 按钮发送电子邮件

javascript - 在 html5 canvas 中绘制图像的一部分

python - 如何找到最接近网格值的点

cuda - 使用cuda纹理内存进行一维插值

javascript - 将 promise 值传递给 header

javascript - 如何修改所有选定 id 的子 li 和 div 的元素?

Javascript Canvas : Collision against enemies not entirely working when rotating player

css - 创建新 Canvas 后奇怪的 Chrome 行为

c++ - 比 if else if else... 更好的方法用于线性插值