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

摘要:
和mask裁剪图片说拜拜,用上高性能的mesh+shader。mesh是决定一个物体形状的东西。mesh初始化需要一个VertexFormat对象。小结以上为白玉无冰使用CocosCreatorv2.2.2开发"使用mesh实现多边形裁剪图片"的技术分享。

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

效果预览:

使用 mesh 实现多边形裁剪图片!Cocos Creator!第1张

使用方法:
  1. 创建一个空节点
  2. 添加用户脚本组件 mesh-texture-mask
  3. 添加图片
  4. 添加修改多边形顶点坐标

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

实现原理

创建 mesh

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

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第3张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第4张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第5张

normalize 表示归一化。

使用 mesh 实现多边形裁剪图片!Cocos Creator!第6张

对于我们的多边形裁剪图片,只需要一个二维坐标和一个纹理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轴向上。

使用 mesh 实现多边形裁剪图片!Cocos Creator!第7张

所以我们可以先求出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;

计算顶点索引

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第8张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第9张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第10张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第11张

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第12张

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

const v1 = p2.sub(p1);
const v2 = p3.sub(p2);
if (v1.cross(v2) >= 0) {
    // 是凸点
}

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

使用 mesh 实现多边形裁剪图片!Cocos Creator!第13张

// 判断一个点是否在三角形内
_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 实现多边形裁剪图片"的技术分享。有想法欢迎留言!如果这篇对你有点帮助,欢迎分享给身边的朋友。


参考资料:
多边形分解成三角形算法


完整代码
原文链接

免责声明:文章转载自《使用 mesh 实现多边形裁剪图片!Cocos Creator!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇EntityFramework Core 学习扫盲关于安装了.xip形式的Xcode8之后,模拟器总是显示黑屏(黑底白苹果图标)的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D之Mesh(一)绘制三角形

前言: Unity自带几种简单的模型,如cube等;一般情况下,其余模型有3D建模软件生成,以合适的文件格式导入unity中;而mesh(以我目前很粗浅的了解)的一般用途就是:对现有的模型进行变形,以达到各种奇幻酷炫的表现效果。 但是由于自己的项目需要,需要由数据(外部解释stl文件获得)按照特定情况以及要求实时地产生各种几何模型,故需要用Mesh进行建模...

Unity3D之Mesh(五)绘制圆

前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的。那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数; 一、实现过程 基本过程与之前的类似,最基本的依然是顶点以及三角形索引数组,即:我们需要根据圆的半径以及预备的分割数,通过算法得到:顶点的Vector3数组 以及对应的三角形索引数组; 1、基本的...

Mesh BRep Shapes

Mesh BRep Shapes eryar@163.com Abstract.当对OpenCASCADE的BRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖分功能。 Key Words. BRep, Mesh, Triangulation 1.Introduction 在OpenCASCADE中网格剖分功能是很重要...

OBJ格式模型详细介绍

一、OBJ是什么 OBJ 是一种几何定义文件格式,Wavefront Technologies 公司在可视化加强动画包中第一次使用了这个格式,文件格式是公开的,并具有及其优质的兼容性和跨平台、跨行业的通用性,在所有 3D 应用软件中被支持。 OBJ 文件可以以 ASCII 编码也可以以二进制格式编码,以 ASCII 格式编码的后缀名为 .obj,以二进制格...

Topology and Geometry in OpenCascade-Vertex

Topology and Geometry in OpenCascade-Vertex eryar@163.com 摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明OpenCascade中的边界表示的具体实现,即拓朴与几何的联系。对具有几何信息的拓朴结构顶点(vertex)、边(edge)、面(face)进行了详细说明...

【Unity】Standard Shader实现分析

记录Unity的标准着色器实现,基于Unity 2017.1版本的代码进行分析。 Standard Shader 文件位于DefaultResourcesExtraStandard.shader 1 //Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT lic...