gpt4 book ai didi

javascript - 在 Fabric js 中的两个对象之间添加动画

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:59 25 4
gpt4 key购买 nike

我有一个非常基本的应用程序,可让您创建形状并用一条线将它们连接起来。为此,您需要执行以下操作。

Example

1. Click new animation
2. add rectangle
3. add child
4. add circle

您可以移动形状、拖动和调整大小。我想知道是否可以在两个对象之间添加动画。因此,例如,一个小圆球会在两个物体之间的线上移动。我已经查看了 fabric js 动画页面上的演示,但不确定是否可以从对象 b 执行。

这是 FIDDLE .

最佳答案

我不知道你是否可以在 fabric 中使用内置的动画功能,因为正如你所说,这些对象可能会自己移动。但是您可以使用一些数学知识轻松地手动制作这样的东西:

enter image description here

您可以将其视为在 0 和 1 之间振荡的波来实现。此函数的正确公式是:

enter image description here

  • 当“Angular ”为 0 或 2π 的倍数时,振幅为 0,因此球位于 object1 的中心
  • 当“Angular ”为π的倍数时,振幅为1,球在object2的中心
  • 当振幅为0.5时,球在两个物体之间

您可以根据时间、任何时间段或您想要的持续时间来增加 Angular 。

var animateBallBetweenObjects = function (obj1, obj2) {

// Add the "ball"

var circle = new fabric.Circle({
radius: 10,
fill: 'blue',
left: obj1.getCenterPoint().x,
top: obj1.getCenterPoint().y,
originX: 'center',
originY: 'middle',
selectable: false
});

canvas.add(circle);

var period = 1000;
var amplitude = 0;
var angle = 0;
var prevTime = Date.now();

var loop = function () {

// Calculate the new amplitude

var now = Date.now();
var elapsed = now - prevTime;
prevTime = now;
angle += Math.PI * (elapsed / (period * 0.5));
amplitude = 0.5 * (Math.sin(angle - (0.5 * Math.PI)) + 1);

// Set the new position

var obj1Center = obj1.getCenterPoint();
var obj2Center = obj2.getCenterPoint();

circle.setLeft(obj1Center.x + (amplitude * (obj2Center.x - obj1Center.x)));
circle.setTop(obj1Center.y + (amplitude * (obj2Center.y - obj1Center.y)));
canvas.renderAll();

requestAnimationFrame(loop);
}

// Animate as fast as possible

requestAnimationFrame(loop);
};

FIDDLE在这里。

关于javascript - 在 Fabric js 中的两个对象之间添加动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com