【问题标题】:Rotating a canvas object around the mouse cursor围绕鼠标光标旋转画布对象
【发布时间】:2014-12-27 15:37:17
【问题描述】:

我正在尝试复制这种效果:http://hakim.se/experiments/html5/trail/03/

我有这个作为粒子构造函数:

function Particle(x, y) {
    this.x = x;
    this.y = y;
    this.radius = 4;
    this.color = '#f0f';
    this.speed = 15;
    this.angle = 0;
}

我正在使用这个循环来为所有粒子实例设置动画:

for (var i = 0, len = particles.length; i < len; i++) {
    var dx = mouse.x - particles[i].x,
        dy = mouse.y - particles[i].y,
        angle = Math.atan2(dy, dx);

    particles[i].vx = Math.cos(angle) * particles[i].speed;
    particles[i].vy = Math.sin(angle) * particles[i].speed;
    particles[i].x += particles[i].vx;
    particles[i].y += particles[i].vy;
    particles[i].draw(ctx);
}

粒子跟随鼠标,但到达光标并开始在其周围闪烁,这不是预期的行为。我想在光标周围转一圈,如示例中所示。有趣的部分是,如果我将particle.speed 设置为30 并将角度添加1000,粒子围绕光标旋转,但速度非常快并且破坏效果...

你可以在这里看到一个活生生的例子:http://codepen.io/gbnikolov/pen/EwafI

欢迎所有建议,提前致谢!

附:我知道指向示例的代码很容易找到,但我对 javascript 比较陌生,而且我不太擅长阅读其他人的代码,也不太了解其背后的逻辑。..

【问题讨论】:

    标签: html animation canvas


    【解决方案1】:

    当前粒子的目标是鼠标光标。但这不是你想要的目标。您需要一个围绕光标移动的目标。而且您希望每个粒子都有一个不同的目标,这样它们就不会悬停在同一个地方。

    还有一些其他的东西是原版做的而你没有做的:

    • 在原文中,粒子速度取决于到目标的距离
    • 他们似乎不能立即改变方向,而是相对缓慢地改变他们的运动方向。

    【讨论】:

    • 那么,我是否应该生成另一组围绕光标旋转的不可见目标并将它们设置为粒子的目标?一旦我让它们围绕光标旋转,我将处理粒子速度和方向的变化......
    • 是的。目前您的目标是 mouse.x/mouse.y。但它应该类似于 mouse.x+Math.cos(time/factor)*radius / mouse.y+Math.sin(time/factor)*radius。你可以从 requestAnimationFrame 回调中获取时间,应该是第一个参数。尝试 factor = 2*Math.PI/4000 每 4 秒旋转一次。我还注意到您根本不使用时间,因此实际速度取决于浏览器的刷新率。您应该确定两次调用之间的时间差,并将其考虑到粒子每帧的速度。
    • 感谢@Tim 的评论,但你能更详细地解释一下这个方程式吗?我为什么要使用时间和因素?
    • 我假设您希望每分钟旋转一定数量,为此您需要将旋转角度绑定到某个时间参考。需要该因子将时间转换为角度,时间通常以毫秒为单位,从某个时间点开始。另一种方法是处理时间差,例如 dt ms 传递,然后将其转换为角度差。这可能是更自然的方法,但有时它更脆弱,当您的脚本没有定期调用时。不过,在交互式模拟中差别不大。
    • 但是为什么我的轮换和时间有关系呢?我将使用缓动(如 vx = Math.sin(angle) *particle.speed )处理每个粒子到目标的速度,它将与旋转运动分开。基本上,据我了解,我需要另一组围绕光标旋转的不可见粒子。然后,我将使用它们的 x 和 y 作为移动粒子的目标。我猜百万美元的问题是如何围绕光标旋转不可见的粒子?
    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多