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


    实现原理:

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

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

    • 线段分割多边形

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

    1. public splitPolygon(
    2. points: cc.Vec2[],
    3. sp: cc.Vec2,
    4. ep: cc.Vec2
    5. ): cc.Vec2[][] {
    6. console.log(points);
    7. let intersectCount = 0;
    8. const polygon1 = [];
    9. const polygon2 = [];
    10. for (let i = 0; i < points.length; i++) {
    11. const p1 = points[i];
    12. const p2 = points[(i + 1) % points.length];
    13. this.convertToInt([p1, p2]);
    14. if (intersectCount === 0) {
    15. polygon1.push(p1);
    16. } else if (intersectCount === 1) {
    17. polygon2.push(p1);
    18. } else if (intersectCount === 2) {
    19. polygon1.push(p1);
    20. }
    21. const point = segmentIntersect(sp, ep, p1, p2);
    22. if (point !== null) {
    23. this.convertToInt([point]);
    24. polygon1.push(point);
    25. polygon2.push(point);
    26. intersectCount++;
    27. }
    28. }
    29. if (intersectCount === 2) {
    30. return [polygon1, polygon2];
    31. }
    32. return [polygon1];
    33. }
    • 获得多边形数组创建成sprite 

    1. //分割多边形
    2. splitSprites(sprites: CustomSprite[]): void {
    3. for (let i = 0; i < sprites.length; i++) {
    4. console.log("第", i, "开始分割");
    5. const baseSprite = sprites[i];
    6. const points = baseSprite.getPolygon();
    7. const { sp, ep } = this.getLocalTouchEndPoint(baseSprite.node);
    8. const newPolygons = this.splitPolygon(points, sp, ep);
    9. newPolygons.forEach((polygon, i) => {
    10. if (i === 0) {
    11. baseSprite.setPolygon(polygon);
    12. } else {
    13. const node = new cc.Node();
    14. const sprite = node.addComponent(CustomSprite);
    15. sprite.texture2D = baseSprite.texture2D;
    16. node.parent = baseSprite.node.parent;
    17. node.position = baseSprite.node.position;
    18. sprite.setPolygon(polygon);
    19. this.customSprites.push(sprite);
    20. console.log("添加新的纹理");
    21. this.isDisperse = true;
    22. }
    23. });
    24. }
    25. }
    • 以线段为边界和几何中心点位置,把多边形分散

    1. //根据几何中心点拿到直线法向量分离
    2. disperseAllSprite(): void {
    3. if (!this.isDisperse) return;
    4. const { p1, p2 } = this.getGraphic();
    5. this.customSprites.forEach((sprite, i) => {
    6. const polygon = sprite.polygon;
    7. const centerP = calculatePolygonGeometryCenter(polygon);
    8. const wp = sprite.node.convertToWorldSpaceAR(centerP);
    9. const np = this.graphic.node.convertToNodeSpaceAR(wp);
    10. const pIntersect = pointLineNormal(np, p1, p2);
    11. const normal = pIntersect.normalize();
    12. sprite.node.x += normal.x * this.getDisperse();
    13. sprite.node.y += normal.y * this.getDisperse();
    14. sprite.setVertsDirty();
    15. // this.printPolygon(polygon);
    16. });
    17. }

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

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

  • 相关阅读:
    给你一颗“定心丸”——记一次由线上事故引发的Log4j2日志异步打印优化分析
    基于linux系统的CAN总线移动机器人- 板子烧入linux系统
    从零开始配置 vim(13)——标签页插件
    uni-app:canvas-图形实现1
    .NET应用国际化支持-葡萄牙语下如何不区分重音的模糊查询
    iphone14到手了?你还需要一个专职管家!
    Python:练习:编写一个程序,录入一个美元数量(int),然后显示出增加%5税率后的相应金额。
    5个节约生命的python小技巧~~~
    Java — 内部类
    字节跳动后端面经(17)
  • 原文地址:https://blog.csdn.net/z1067832450_/article/details/134077328