玻璃破碎效果

玻璃破碎效果,大家可以想一想,比如拿一块砖头砸玻璃,肯定是由砖块触碰玻璃的那个点位破碎的点,一点一点成圆形(或者蜘蛛网形)向外扩展看图,一般来说玻璃破碎之后都应该是不规则形状的,我们这边为了简单就用的三角形

破碎特点

  1. 越靠近撞击原点,破碎的块越小,破碎的块越多

五角星5.png

下面是实现之后的效果

2022-07-17 183040.gif

我们这里用到了TweenMax插件和delaunay插件 TweenMax主要是做动画用的 delaunay 计算三角形的的三个点的坐标

核心思想

首先我们要获取点击图片的点的坐标,以获取的坐标点为圆心,一层一层往外扩散直到图片的最大宽和高,以当前的圆心点及扩散范围的半径,用delaunay里的方法计算三角形的三个点的坐标,然后我们使用canvas去画这个破碎的图片,每个破碎的三角块,都是一个canvas画布。

posui1.jpg

    // 以上图为例 a b c 就是扩散的范围 c 就是在个范围扩散的点 需要以这个点为起点利用Delaunay插件的方法triangulate 计算三角形的三个点
    var rings = [           
            {r:50, c:30},
            {r:150, c:20},
            {r:300, c:10},
            // {r:400, c:20},
            // {r:500, c:20},
            {r:800, c:15},
            // {r:1200, c:20} 
        ],
        x,
        y,
        centerX = clickPosition[0],  
        centerY = clickPosition[1];

    vertices.push([centerX, centerY]); // 第一个点是 鼠标点击的点 以这个点为圆心去扩散 扩散的范围rings

    rings.forEach(function(ring) {
        var radius = ring.r, // 原始的扩散半径
            count = ring.c, // 扩散点
            variance = radius * 0.25; // 扩散半径

        for (var i = 0; i < count; i++) {
            x = Math.cos((i / count) * TWO_PI) * radius + centerX + randomRange(-variance, variance); 
            y = Math.sin((i / count) * TWO_PI) * radius + centerY + randomRange(-variance, variance); 
            vertices.push([x, y]);
        }
    });

    vertices.forEach(function(v) { // 需要做一个过滤 把大于图片长宽的换掉
        v[0] = clamp(v[0], 0, imageWidth); // 
        v[1] = clamp(v[1], 0, imageHeight);
    });
    console.log(vertices)
    indices = Delaunay.triangulate(vertices); // 三角剖分算法 对这个
    console.log(indices)

我们在过程当中调用 请看图,把三个点的坐标传了进去

计算444.jpg

算出三个点的坐标之后就需要去剪裁这个图片让其有破碎感了,我们利用上一步计算的坐标去算

第一步

初始化属性和触发函数

赋值3.png

第二步

计算x的最大值 最小值 可以计算出当前box的宽和高

第二步.png

第三步

计算盒子的中心点坐标 动画的时候会用到

第三步.png

第四步

新建canvas元素赋一些原始值

第四步.png

第五步

开始剪裁图片

第五步.png

我会把代码块发布,但是没发显示出来,大家如果想玩的话,可以直接复制里面的代码,赋值到本地,

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了

猜你喜欢

转载自juejin.im/post/7121955991670751263