【问题标题】:Paper.js pathData animation onFrame and onMouseDragPaper.js pathData 动画 onFrame 和 onMouseDrag
【发布时间】:2016-08-15 22:50:45
【问题描述】:

我使用pathData 方法[demo] 创建了一条线。我希望线条在onFrame 函数中产生小波浪效果。此外,当onMouseDrag 运行时,这条线会产生橡皮筋效应,而onMouseUp 运行时它会恢复到原来的形状。我是Paper.js 的新手,所以当我编写一些代码时,我会得到失去对象形状的动画。检查以下代码

代码更新

var amount = 55;
var center = view.center;

function onFrame(event) {
    // Loop through the segments of the path:
    for (var i = 0; i <= amount; i++) {
        var path = linePath;
        var segment = path.segments[i];

        // A cylic value between -1 and 1
        var sinus = Math.sin(event.time * 3 + i);

        // Change the y position of the segment point:
        segment.point.y = sinus * 1 + center.y;
    }
}

function onMouseDrag(event) {
   var location = linePath.getNearestLocation(event.point);
   var segment = location.segment;
   var point = segment.point;
   if (!point.fixed && location.distance < 600 / 4) {
      var y = event.point.y;
      point.y += (y - point.y) / 6;
      if (segment.previous && !segment.previous.fixed) {
        var previous = segment.previous.point;
        previous.y += (y - previous.y) / 24;
      }
      if (segment.next && !segment.next.fixed) {
        var next = segment.next.point;
        next.y += (y - next.y) / 24;
      }
    }
 }

Live demo^^

请任何 paperJs 专家帮助我实现它。帮助将不胜感激,在此先感谢。

【问题讨论】:

    标签: javascript html animation canvas paperjs


    【解决方案1】:

    首先是波浪效果的问题。您只是沿 Y 轴变换。这可能是你想要的,但我假设它不是。

    通常情况下,如果沿着线的normal vector变换线,效果会好很多。法线将是垂直于线方向的方向。所以,当你变换时,看起来波是沿着线本身传播的。

    在 2D 中计算法线很容易,因为您只需要在单个平面上反映当前方向。

    var deltaX = nextSegment.point.x - segment.point.x;
    var deltaY = nextSegment.point.y - segment.point.y;
    var length = Math.sqrt( deltaX * deltaX + deltaY * deltaY );
    
    var normal = [ deltaX / length, deltaY / length ];
    normal = [ normal[ 1 ], -normal[ 0 ] ];
    

    我们现在可以使用该法线来变换线条:

    toManipulate.point.x = segment.point.x + normal[0] * sinus * 3;
    toManipulate.point.y = segment.point.y + normal[1] * sinus * 3;
    

    您可以在my fork of your fiddle 中查看。

    另一个关键方面是,您不想转换原始数据。这就是我创建另一个副本的原因:

    var linePathCached = new Path(dataLine);
    var linePath = new Path(dataLine);
    

    您将始终需要原始数据的副本,以便您可以操作副本并将旧数据用于下一帧中的新转换。

    现在,第二个,你的橡皮筋效应。

    您已经非常接近当前的代码了。但是,同样,您正在转换原始数据,这没有帮助。

    为了达到这个效果,我建议为您的原始数据创建第二个副本,将您带到 3 个数据集:

    1. 您的原始线路路径,用作所有转换的基础。
    2. 通过鼠标拖动操作的线路路径。
    3. 您正在渲染的线条路径。

    在您的 onMouseDrag 处理程序中,您将转换您的集合 2。

    在您的 onFrame 处理程序中,您将应用您已经对第 2 组进行的正弦波变换并生成第 3 组。此外,您将在它们的当前位置和它们在第 1 组中的原始位置之间插入所有段。

    您可以应用非常常见的elasticOut equation,或者查看other spring 相关的实现。

    【讨论】:

    • 你已经创建了一个原始线路径的副本来操作波浪效果,我有点困惑原始副本是所有转换的基础,第一个副本是 onFrame 中的波浪效果处理程序和第二个复制通过鼠标拖动操作的第三个数据集,然后是“3.您正在渲染的行路径。”。这是正确的方法还是你能清除一些简单的方法。@oliver
    • @Krish 我更新了小提琴来说明我的意思。希望现在更清楚一点:) jsfiddle.net/uq4ygujx/2
    • @Krish 因为太有趣了,所以我继续调整你的onDrag 以使用拖动的实际方向向量进行操作。它仍然不完美,但我希望你能它完美;)jsfiddle.net/uq4ygujx/3Cheers
    • 这真是不可思议,你是一个如此出色的编码员。我不知道如何表达感谢,但你值得 (y) :) @oliver
    • 还有一件事我们不需要第三方缓和实施?也可以像这样在paperJS中支持磁力效应bl.ocks.org/sxv/4491174
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2016-09-26
    • 2016-01-09
    相关资源
    最近更新 更多