多边形裁剪与Gizmo!新版!Cocos Creator !

支持缩放旋转,支持合图,支持gizmo添加节点和调整位置,支持顺时针逆时针。

效果预览与使用

原理

回顾

在gizmo入门探索介绍了 gizmo 与多边形裁剪的配合。

在使用 mesh 实现多边形裁剪图片 中介绍了 mesh 和切耳法的相关使用。

相比mask组件,这种meshRenderer的实现可以降低两个draw call。

因为小伙伴使用的比较多,这边对这个多边形裁剪图片进行一次升级,增加易用性!

升级后添加了以下几个特性:

升级版本至 Cocos Creator 2.4 (一些接口的变化)

支持多边形节点顺时针和逆时针两种方式

支持 gizmo 直接添加多边形节点

支持节点缩放旋转后,gizmo 的正确显示

支持合图,图片资源可以勾选 packable

接下来就大致讲解主要特性的原理吧。

分割多边形

这次不采用切耳法分割分割了,而是采用poly2tri这个库去分割(注意这个库有严格的限制)。

主要计算顶点索引过程如下。

// 计算顶点索引

const ids = [];

// 多边形切割 poly2tri,支持简单的多边形,确保顶点按顺序且不自交

const countor = this.vertexes.map((p) => { return { x: p.x, y: p.y } });

const swctx = new poly2tri.SweepContext(countor, { cloneArrays: true });

swctx.triangulate();

const triangles = swctx.getTriangles();

triangles.forEach((tri) => {

tri.getPoints().forEach(p => {

const i = countor.indexOf(p as any);

ids.push(i);

});

})

mesh.setIndices(ids);

支持合图

引用一张 @GT 的图。

在 SpriteFrame 里含有这个uv信息,这里可以做一次转换,先计算 0~1 的比例,再做一次转化坐标。

private _lerp(a: number, b: number, w: number) {

return a + w * (b - a);

}

const uv = this.spriteFrame.uv;

const texture = this.spriteFrame.getTexture();

/**

* t

* l r

* b

*/

const uv_l = uv[0];

const uv_r = uv[6];

const uv_b = uv[3];

const uv_t = uv[5];

// 计算uv

const uvs = [];

for (const pt of this.vertexes) {

const u = this._lerp(uv_l, uv_r, (pt.x + texture.width / 2 + this.offset.x) / texture.width);

const v = this._lerp(uv_b, uv_t, (pt.y + texture.height / 2 - this.offset.y) / texture.height);

uvs.push(cc.v2(u, v));

}

mesh.setVertices(gfx.ATTR_UV0, uvs);

gizmo 增加多边形顶点

整体思路是先根据所有顶点画线段,给线段添加事件监听,在点击位置添加一个节点。

点击转换坐标有个坑,y的坐标要用一个高度减去后再转换(感谢@GT的pr)。

start: (x, y, event, param) => {

y = this._view.offsetHeight - y;

// 转换不正确,会有偏移 todo

let position = cc.v2(x, y);

position = Editor.GizmosUtils.snapPixelWihVec2(position);

position = this._view.pixelToWorld(position);

position = node.convertToNodeSpaceAR(position);

}

gizmo 支持旋转缩放

整体来说,就是将坐标点先做缩放,再做旋转处理即可。

this._tool.plot(target.vertexes.map((p) => {

let scaleX = node.scaleX;

let scaleY = node.scaleY;

let angle = -node.angle * Math.PI / 180;

const cos_angle = Math.cos(angle);

const sin_angle = Math.sin(angle);

const v = Editor.GizmosUtils.snapPixelWihVec2(p.mul(this._view.scale));

return cc.v2(

(v.x * cos_angle * scaleX + v.y * sin_angle * scaleY),

-(-v.x * sin_angle * scaleX + v.y * cos_angle * scaleY)

);

}), position);

小结

坐标转换!旋转!跳跃!不停歇!

以上为白玉无冰使用 Cocos Creator v2.4 实现 "多边形裁剪!" 的技术分享。欢迎分享给身边的朋友!

知识不过是潜在的力量,只有将它组织成明确的行动计划,并指引它朝着某个明确目的发挥作用的时候,知识才是力量。

matlab里用多边形裁剪图片,多边形裁剪图片与自定义 Gizmo Cocos Creator相关推荐

  1. 如何在matlab里批量将JPG格式图片转成MAT格式文件?

    http://blog.csdn.net/yongjiankuang/article/details/72824081 考虑到很多人遇到图片转成.mat文件的需要,本文特此贴出一次性将多个文件夹下的图 ...

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

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

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

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

  4. 如何从Matlab中导出清晰的结果图片

    如何从Matlab中导出清晰的结果图片 写论文和报告都需要放结果图.但是保存图像的方法不当,保存图片放大缩小都不清晰.且容易出现字比外框大的情况. 这样: 下面介绍出现不清晰的可能原因,以及可参考的解 ...

  5. matlab jpg合成gif,用MATLAB将照片合成视频或者GIF图片、以及Photoshop制作GIF图片

    用MATLAB将照片合成视频或者GIF图片.以及Photoshop制作GIF图片 一.用MATLAB将照片合成视频(我使用的MATLAB是2015版本的) (1).你需要需要合成视频的图片. 所有照片 ...

  6. 用matlab把表转化为图片,matlab怎么excel数据转化为图像《matlab将excel数据读成图片》...

    这个表格的数据怎样用matlab转换为图像?是一个49*57的表格 load进workspace,数值类型做一定的转换,就可以了. 如何将Excel中的数据导入MATLAB并在MATLAB中画出图像 ...

  7. MATLAB批量为png透明(抠图)图片替换添加背景

    MATLAB批量为png透明(抠图)图片替换添加背景 说明 最近有个小需求, 需要抠图后将抠图的背景替换为指定图片, 如果一张一张做, 图片多了实在是不好用. 前提 准备好背景图片, 一张 准备好目标 ...

  8. gabor小波matlab,用matlab实现gabor小波对图片的纹理特征提取【转】

    用matlab实现gabor小波对图片的纹理特征提取[转] (2009-04-27 14:35:41) 过程如下: (1)在matlab中,用gaborfilter.m程序实现对三种农作物(小麦.棉花 ...

  9. MATLAB如何保存仿真高清图片(matlab)

    MATLAB如何保存仿真高清图片!(matlab) 1.先打开你的fig文件: 2.在命令窗口输入: print -f1 -djpeg -r600 mypic 并回车,图片就保存到与fig文件的同文件 ...

  10. 在PHP里使用 ImageMagick 生成 base64 图片

    个人博客 duanruilong.github.io/blog/ 本文原地址duanruilong.github.io/blog/2018/0- 最近的PHP项目中,需要用到画图和图片拼接效果,这里是 ...

最新文章

  1. PMcaff-培训 | 活动报名结束,押金和邮件须知的那些事儿
  2. python调研报告总结体会_调研报告心得(多篇)
  3. 如何用python生成软件_python中的生成器函数是如何工作的?
  4. [CSP-S Day1,Day2 游记]提高组考后总结及学习编程C++以来的心得体会
  5. 【洛谷P1833】樱花
  6. c语言:猴子吃桃问题
  7. 谷歌免费GPU训练星际2AI好难?你需要份debug指南
  8. 写在自己工作六年:转载《软件工程师六年心得体会》
  9. IOS用标签显示滑块的值
  10. $ 在 JQuery 里的意思
  11. THREEJS基础入门
  12. 问题 C: [入门OJ]和||
  13. 【新书推荐】【2019】电磁理论和等离子体电子学的工程师手册
  14. php微信客服,微信客服管理 - 微信公众平台开发者文档 - php中文网手册
  15. 【DCANet2022】:DCANet: Differential Convolution Attention Network for RGB-D Semantic Segmentation
  16. win7计算机属性资源管理器停止工作,Win7系统Windows资源管理器已停止工作怎么解决?...
  17. java正则在线转换_java正则表达式(转)
  18. DeFi 入门必备:你需要了解的 DeFi 重要词语
  19. ZOJ - 4049 Halting Problem 题解【c++】
  20. simulink仿真单极性spwm_FC系统|基于Matlab/Simulink的PEMFC建模与非线性控制

热门文章

  1. 解除微信授权的html5网页,微信授权登录网页管理在哪里看?如何取消授权
  2. 外贸人必收藏开发客户、找邮箱等高效工具
  3. PhotoShop等比缩放图片
  4. android 视频 宽高比,科普:什么是视频宽高比?
  5. JS计算日期相减天数
  6. postman常用断言
  7. Microsoft C++ 异常: dlib::serialization_error,位于内存位置 0x0133F818 处
  8. 万物互联时代,有一款好设计你需要知道
  9. html播放韰 寸 频,asp.net 汉字转换拼音及首字母实现代码
  10. php支付宝接口开发流程,对接支付宝支付接口开发详细步骤(证书签名方式)