> 和 mask 裁剪图片说拜拜,用上高性能的 mesh + shader 。文章底部获取完整代码!

效果预览:

使用方法:

创建一个空节点

添加用户脚本组件 mesh-texture-mask

添加图片

添加修改多边形顶点坐标

实现原理

创建 mesh

mesh 是什么? mesh 是决定一个物体形状的东西。 例如在二维中可以是正方形、圆形、三角形等;在三维中可以是正方体、球体、圆柱体等。

mesh 初始化需要一个 VertexFormat 对象。这个对象是顶点格式对象。

其中 name 是对应顶点着色器的 attribute 变量的值。 type 对应数据类型,决定了每个数据大小。

num 对应有几个数据分量(猜的哈哈!)。例如二维坐标和纹理uv坐标一般只有x和y两个分量,所以设置为2;三维坐标有xyz三个变量,所以值为3;而颜色一般有 rgba 四个分量,所以设置为4。

normalize 表示归一化。

对于我们的多边形裁剪图片,只需要一个二维坐标和一个纹理uv坐标,创建 mesh 参考代码如下:

const gfx = cc.gfx;

let mesh = new cc.Mesh();

mesh.init(new gfx.VertexFormat([

{ name: gfx.ATTR_POSITION, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },

{ name: gfx.ATTR_UV0, type: gfx.ATTR_TYPE_FLOAT32, num: 2 },

]), this.vertexes.length, true);

计算纹理uv坐标

纹理uv坐标系在左上角,u轴是向右,v轴是向下,范围是 0~1。而我们的坐标系在中间,x轴向右,y轴向上。

所以我们可以先求出x,y在左下角的占比,然后再反转一下y轴,转成uv坐标系。参考代码如下。

const vx = (pt.x + this.texture.width / 2 + this.offset.x) / this.texture.width;

const vy = 1.0 - (pt.y + this.texture.height / 2 + this.offset.y) / this.texture.height;

计算顶点索引

首先需要知道一个概念,绘制一个形状实际上是绘制多个三角形。一个多边形可以分割成多个三角形,而顶点索引是告诉它如何去绘制这些三角形。

如何将一个多边形切割成多个三角形?可以采用'耳切法'的方式。把多边形的一个耳朵切掉,然后再对剩下的多边形再次切割。

怎么样的耳朵才能切呢?这个耳朵的顶点需要满足是凸顶点且没有其他顶点在这个耳朵里。

如何判断是凸顶点呢?首先要知道向量外积的定义,表示向量的法向量。方向根据右手法则确定,就是手掌立在a、b所在平面的向量a上,掌心由a转向b的过程中,大拇指的方向就是外积的方向。

对于cc.Vec2的外积就是面积,有正负之分,也是根据右手法则确定。

若多边形ABCDEF顶点以逆时针顺序排序的话,AB x BC >= 0 表示B点是凸顶点。参考代码如下。

const v1 = p2.sub(p1);

const v2 = p3.sub(p2);

if (v1.cross(v2)>= 0) {

// 是凸点

}

判断点D是否在三角形ABC内,可以通过外积计算点与线的位置关系判断出。

// 判断一个点是否在三角形内

_testInTriangle(point, triA, triB, triC) {

let AB = triB.sub(triA), AC = triC.sub(triA), BC = triC.sub(triB), AD = point.sub(triA), BD = point.sub(triB);

return (AB.cross(AC) >= 0 ^ AB.cross(AD) < 0) // D,C 在AB同同方向

&& (AB.cross(AC) >= 0 ^ AC.cross(AD) >= 0) // D,B 在AC同同方向

&& (BC.cross(AB) > 0 ^ BC.cross(BD) >= 0); // D,A 在BC同同方向

},

最后把以上综合起来就可以计算出顶点索引。

小结

以上为白玉无冰使用 Cocos Creator v2.2.2 开发"使用 mesh 实现多边形裁剪图片"的技术分享。有想法欢迎留言!如果这篇对你有点帮助,欢迎分享给身边的朋友。

java 多边形裁剪_使用 mesh 实现多边形裁剪图片!Cocos Creator!相关推荐

  1. Java毕业设计_基于SSM框架的图片素材管理系统的设计与实现

    基于SSM框架的图片素材管理系统的设计与实现 基于SSM框架的图片素材管理系统的设计与实现mysql数据库创建语句 基于SSM框架的图片素材管理系统的设计与实现oracle数据库创建语句 基于SSM框 ...

  2. 使用 mesh 实现多边形裁剪图片!Cocos Creator!

    和 mask 裁剪图片说拜拜,用上高性能的 mesh + shader .文章底部获取完整代码! 效果预览: 使用方法: 创建一个空节点 添加用户脚本组件 mesh-texture-mask 添加图片 ...

  3. 多边形裁剪图片与自定义 Gizmo !Cocos Creator Gizmo!

    支持合图,支持gizmo添加节点和调整位置,支持缩放旋转.文章底部获取完整项目! 效果预览与使用 原理 回顾 在gizmo入门探索介绍了 gizmo 与多边形裁剪的配合. 在使用 mesh 实现多边形 ...

  4. 怎么在java中引用图片_如何使用Java(读/写)读取复制和粘贴图片?

    在Java语言编程中,如何使用Java(读/写)读取复制和粘贴图片? 注意:需要访问网址:http://book2s.com/java/jar/o/opencv/download-opencv-3.2 ...

  5. JAVA入门_多线程_邮局派发信件

    JAVA入门_多线程_邮局派发信件 Postman package cn.campsg.java.experiment.entity;public class Postman {private Str ...

  6. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  7. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

  8. java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计

    java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计 [源码请到资源专栏下载] 本系统主要是通过智能手表监控老人的日常生活,比如血压.心率.睡眠 ...

  9. java群发图文消息_java微信群发图文消息 java总结_图文.doc

    java微信群发图文消息 java总结_图文 PAGE PAGE 22 java微信群发图文消息 java总结_图文 java总结 java微信群发图文消息 java总结_图文 在做微信高级接口开发中 ...

  10. jquery 图片裁剪 java_[Java教程]5 款最新的 jQuery 图片裁剪插件

    [Java教程]5 款最新的 jQuery 图片裁剪插件 0 2015-05-18 16:00:20 这篇文章主要介绍最新的 5 款 jQuery 图片裁剪插件,可以帮助你轻松的实现你网站需要的图像裁 ...

最新文章

  1. 『模板 高精度计算』
  2. 多文件目录下makefile文件递归执行编译所有c文件 很不错
  3. Android NDK调试定位错误
  4. OnClickListener冲突的问题
  5. Butterknife使用——转
  6. Docker 安装 redis 、Redis docker 方式部署
  7. java tcp 字节数_服务器无法接收大小超过1500字节的TCP数据包
  8. 阅文启动“2022全球作家孵化项目” 加速网络文学出海
  9. 将system.out.println的输出,输出调用类等其他参数的方法
  10. 启用zhparser插件时一直报Permission denied
  11. 稳压二极管型号对应电压表
  12. selenium官网下载地址
  13. Eclipse+Java+Swing实现宠物商店管理系统
  14. 安卓手机 ADB 操作指令
  15. 将本地图片或者网上图片用post方式上传到图片服务器
  16. socket编程之socket()
  17. 北斗时钟服务器(NTP服务器)让高考时间更加精准
  18. 互联网+竞赛赛后总结
  19. B1094 谷歌的招聘 (20 分)
  20. SpringBoot实现i18n国际化配置(超详细之跟着走就会系列)

热门文章

  1. 1筐鸡蛋1个1个拿 php,1个1个拿正好拿完 9个9个拿正好拿完(求答案 ? 一筐鸡蛋: 1个1个拿,正好拿完。 2个2个拿,还剩1个。)...
  2. 华米Zepp小程序开发入门
  3. FragmentVisible
  4. 夜神模拟器99%卡死打不开问题
  5. java dto 生成_java – 从多个源DTO映射到一个目标
  6. Pygame——创建游戏地图
  7. 最短哈密尔顿圈matlab解法_数学建模学习笔记
  8. ESXI7.0下载地址
  9. 【c++学习】int main(int argc, char** argv)命令行参数理解
  10. js-纳税人识别码验证