当前位置: 首页 > article >正文

第三篇:实践篇 《使用Assembler 实现图片任意切割功能》

实现原理:

共用一个texture、material、渲染状态等。紧通过修改vertex、uvs、indexes数据即可实现任意切割功能。

一、线段分割多边形,并分散多边形

  • 线段分割多边形

已知多边形points,线段sp、ep。线段分割多边形得到两个多边形。

public splitPolygon(
    points: cc.Vec2[],
    sp: cc.Vec2,
    ep: cc.Vec2
  ): cc.Vec2[][] {
    console.log(points);

    let intersectCount = 0;
    const polygon1 = [];
    const polygon2 = [];

    for (let i = 0; i < points.length; i++) {
      const p1 = points[i];
      const p2 = points[(i + 1) % points.length];
      this.convertToInt([p1, p2]);
      if (intersectCount === 0) {
        polygon1.push(p1);
      } else if (intersectCount === 1) {
        polygon2.push(p1);
      } else if (intersectCount === 2) {
        polygon1.push(p1);
      }
      const point = segmentIntersect(sp, ep, p1, p2);

      if (point !== null) {
        this.convertToInt([point]);
        polygon1.push(point);
        polygon2.push(point);
        intersectCount++;
      }
    }
    if (intersectCount === 2) {
      return [polygon1, polygon2];
    }
    return [polygon1];
  }
  • 获得多边形数组创建成sprite 

//分割多边形
  splitSprites(sprites: CustomSprite[]): void {
    for (let i = 0; i < sprites.length; i++) {
      console.log("第", i, "开始分割");
      const baseSprite = sprites[i];
      const points = baseSprite.getPolygon();
      const { sp, ep } = this.getLocalTouchEndPoint(baseSprite.node);
      const newPolygons = this.splitPolygon(points, sp, ep);
      newPolygons.forEach((polygon, i) => {
        if (i === 0) {
          baseSprite.setPolygon(polygon);
        } else {
          const node = new cc.Node();
          const sprite = node.addComponent(CustomSprite);
          sprite.texture2D = baseSprite.texture2D;
          node.parent = baseSprite.node.parent;
          node.position = baseSprite.node.position;
          sprite.setPolygon(polygon);
          this.customSprites.push(sprite);

          console.log("添加新的纹理");
          this.isDisperse = true;
        }
      });
    }
  }
  • 以线段为边界和几何中心点位置,把多边形分散

 //根据几何中心点拿到直线法向量分离
  disperseAllSprite(): void {
    if (!this.isDisperse) return;
    const { p1, p2 } = this.getGraphic();
    this.customSprites.forEach((sprite, i) => {
      const polygon = sprite.polygon;
      const centerP = calculatePolygonGeometryCenter(polygon);
      const wp = sprite.node.convertToWorldSpaceAR(centerP);
      const np = this.graphic.node.convertToNodeSpaceAR(wp);
      const pIntersect = pointLineNormal(np, p1, p2);
      const normal = pIntersect.normalize();
      sprite.node.x += normal.x * this.getDisperse();
      sprite.node.y += normal.y * this.getDisperse();

      sprite.setVertsDirty();

      // this.printPolygon(polygon);
    });
  }

二、Assembler自定义(vertex数据、uv数据、indexes数据)

第四篇:实践2 《使用MeshRender 实现图片任意切割功能》


http://www.kler.cn/a/106406.html

相关文章:

  • rust高级特征
  • 小白进!QMK 键盘新手入门指南
  • 一文详细深入总结服务器选型
  • Python教程笔记(2)
  • transformers 操作篇
  • Docker和VMWare有什么不同
  • 企业信息集成
  • 36基于matlab的对分解层数和惩罚因子进行优化
  • Tomcat的动静分离
  • spring监听请求执行结束,移除当前ThreadLocal数据两种方法
  • CFD模拟仿真理论知识:流体仿真应用
  • tmux和vim
  • InstructionGPT
  • Chimera:混合的 RLWE-FHE 方案
  • dto参数校验及统一异常处理
  • 分组卷积的思想神了
  • Autojs 利用OpenCV识别棋子之天天象棋你马没了
  • vue列表导出word文档
  • pre标签变成可以编辑的状态
  • 国产CAN总线收发芯片DP1042 兼容替换TJA1042
  • Linux 云服务器磁盘挂载简介
  • Transit path
  • SpringMVC原理及核心组件
  • 【大数据 - Doris 实践】数据表的基本使用(五):ROLLUP
  • MODBUS-TCP通信客户端如何访问服务器端RS485总线上的从站(SMART PLC梯形图程序)
  • 服务网络基础