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

news2024/9/24 1:27:00

实现原理:

共用一个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.coloradmin.cn/o/1141095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双十一期间VBA钜惠

大家好&#xff0c;本年度双11即将到来&#xff0c;为了答谢大家多年来的支持及更广泛的推广VBA的应用&#xff0c;“VBA语言専功”在此期间推出巨大优惠&#xff1a;此期间打包购买VBA技术资料实行半价优惠。 1 &#xff1a;面向对象&#xff1a;学员及非学员 2 &#xff1a…

AR眼镜安卓主板,智能眼镜光机方案定制

AR智能眼镜是一项涉及广泛技术的创新产品&#xff0c;它需要考虑到光学、显示、功耗、散热、延迟、重量以及佩戴人体工学等多个方面的因素&#xff0c;每一个项目都是技术进步所需攻克的难题。 在本文中&#xff0c;我们将重点讨论AR眼镜的主板和光学方案。 首先是AR智能眼镜的…

OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)

响应鼠标事件 3. 响应鼠标事件3.1 获取鼠标点击的坐标3.2 获取鼠标点击像素点的颜色3.3 在鼠标点击的位置生成圆3.4 通过拖动鼠标来绘制填充矩形3.5 通过拖动鼠标绘制未填充矩形3.6 使用鼠标选点绘制多边形3.7 按住鼠标左键进行绘图 3. 响应鼠标事件 使用OpenCV读取图像&#…

2023年第四届MathorCup大数据挑战赛(B题)|电商零售商家需求预测及库存优化问题|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 希望这些想法对大家的做题有一定的启发和借鉴意义。 让我们来…

python接口自动化测试

写在前面的话&#xff1a; 这个是我实际工作中写的项目&#xff0c;主要用来备注和后期查看~~大家可以参考学习&#xff0c;但是请不要用于其他不好的途径~~ 准备工作&#xff1a; 先下载HTMLTestRunner.py 下载地址&#xff1a;HTMLTestRunner - tungwaiyips software 参考&a…

框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现

目录 服务攻防-框架安全&CVE 复现&Spring&Struts&Laravel&ThinkPHP概述PHP-开发框架安全-Thinkphp&Laravel漏洞复现Thinkphp-3.X RCEThinkphp-5.X RCELaravel框架安全问题- CVE-2021-3129 RCE JAVAWEB-开发框架安全-Spring&Struts2Struts2框架安全…

【MATLAB源码-第59期】基于matlab的QPSK,16QAM164QAM等调制方式误码率对比,调制解调函数均是手动实现未调用内置函数。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

Python中的*args 和 **kwargs

在Python中的代码中经常会见到这两个词 args 和 kwargs&#xff0c;前面通常还会加上一个或者两个星号。其实这只是编程人员约定的变量名字&#xff0c;args 是 arguments 的缩写&#xff0c;表示位置参数&#xff1b;kwargs 是 keyword arguments 的缩写&#xff0c;表示关键字…

【优选算法系列】第一节.双指针(283. 移动零和1089. 复写零)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…

暄桐推荐|学书法的必读书目

在暄桐教室&#xff0c;写字之外&#xff0c;读书、静坐也是桐学们修习的功课。今天&#xff0c;便向你推荐&#xff0c;关于学习书法&#xff0c;暄桐教室的那些必读书目&#xff1a;    暄桐推荐学书法必读书之初阶书目&#xff1a;      对零基础的小白同学或刚入门…

VSCode远程连接

1 VSCode 远程连接服务器 1、下载vscode 百度搜索vscode&#xff08;注意不是visual studio&#xff09;&#xff0c;进入vscode官网进行下载。 2、安装ssh插件 根据你的操作系统选择对应的版本进行下载和安装。 安装完成之后&#xff0c;启动vscode&#xff0c;选择左侧Exten…

使用 Visual Studio Code 编写 TypeScript程序

安装 TypeScript 首先&#xff0c;确保你已经安装了 TypeScript&#xff0c;如果没有安装&#xff0c;请参考https://blog.csdn.net/David_house/article/details/134077973?spm1001.2014.3001.5502进行安装 创建 新建一个文件夹&#xff0c;用vs code打开&#xff0c;在文…

SpringBoot 集成 kaptcha 验证码

简介 这里就一句话说明了哈&#xff0c;并能找到这里&#xff0c;都是知道这个是要干嘛的了。kaptcha 是谷歌开源的简单实用的验证码生成工具。 项目源码 项目工程源码路径&#xff0c;点击这里&#xff0c; 可以结合源码来看。 项目搭建 项目工程截图 第一步&#xff1a;…

vue使用Element-plus的Image预览时样式崩乱

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题&#xff1a; 在使用组件库的image时出现了点小问题&#xff0c;预览的图片层级反而没有表格的层级高 效果图&#xff1a;…

FL Studio21最新中文汉化解锁版,2024怎么激活FL Studio

FL Studio2024最新中文汉化解锁版是一款功能强大的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;它广泛应用于音乐创作和音乐制作领域。在使用FL Studio时&#xff0c;购买正版软件是否有必要呢&#xff1f;本文将详细探讨FL Studio的功能特点以及正版软件的重要性。…

【C++那些事儿】内联函数,auto,以及C++中的空指针nullptr

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我之前看过一套书叫做《明朝那些事儿》&#xff0c;把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言&#xff0c;无疑是抽象且难度颇…

【电路笔记】-电路中的复数与相量(Phasor)

电路中的复数与相量(Phasor) 文章目录 电路中的复数与相量(Phasor)1、概述2、复数定义3、复数计算规则4、电子领域的复数5、总结 复数是一种重要的数学工具&#xff0c;广泛应用于包括电子学在内的许多物理领域。 这个概念可能看起来很奇怪&#xff0c;但它们的操作很简单&…

鸡尾酒学习——薄荷夏日

1、材料&#xff1a;冰块&#xff08;或者雪莲&#xff09;、牛奶、朗姆酒、绿薄荷糖浆&#xff1b; 2、口感&#xff1a;有点像是再吃薄荷奶糖口味的酒心奶糖。 3、视觉效果&#xff1a;白色加上一点点绿色&#xff1b; 4、步骤&#xff1a; &#xff08;1&#xff09;向摇壶内…

如何使用react-router v6快速搭建路由?

前言 之前一直使用react-router V5&#xff0c;上次搭建一个小项目&#xff0c;下载的react-router V6&#xff0c; 本以为没什么区别&#xff0c;就按照v5的那一套用了&#xff0c;区区小功能&#xff0c;奈何不了我的。然后自信满满的运行&#xff0c;哦豁&#xff0c;不生效…