效果
实现
整体思路
思路遵循以下几步
- 初始化一个多边形。
- 折叠后分割成两个多边形。
- 如果需要继续分割,对场上的所有多边形进行折叠,折叠出新的多边形的层级正好与原来的相反。
所以,所有的计算和渲染都可以转换成对一个多边形的操作。
为了简化计算,我们约定初始化的多边形为凸多边形。这么做有几个好处。
- 折叠后生成的仍是凸多边形,并且对于每个多边形只会折叠出两个
- 渲染时,分割凸多边形为三角形特别方便,即能快速计算出顶点索引
计算
主要分为三块
- 多边形分割
- 线线交点
- 轴对称
分割
观察触摸方向和多边形各个点的关系。
可以发现,触摸方向 与 触摸方向中点指向多边形顶点 的夹角决定了分割后的多边形的点。
- 当夹角大于90度时,该顶点正好是折叠多边形的顶点。
- 当夹角等于90度时,该顶点是两个多边形的顶点。
- 当夹角小于90度时,该顶点是底部多边形的顶点。
向量间的点积正好可以帮助我们判断夹角问题。
交点
当被分割的多边形相邻两点与触摸方向的夹角不同时(属于两个多边形的点),需要计算触摸向量的垂直线与该线段的交点。
直线上的一点可以用点和向量表示。
把两直线的点表达式结合,再运用克莱姆法则(Cramer's Rule
)求出交点。
这里计算的是比例t
,这个t
不仅可以用来求出顶点坐标,也可以求出相交的纹理坐标。
对称点
折叠多边形的顶点正好是原多边形顶点关于触摸垂直轴对称的点。
求对称点同样可以运用向量计算。
- 求出该顶点与中点的向量
- 求出该点在触摸方向的单位向量的投影(点乘),这正好是距离的一半
- 求出对称点坐标(距离乘方向向量+起始点坐标)
渲染
渲染一个图形一般是由三角形组成。
对于凸多边形,分割三角形就比较简单。选取其中一个顶点,和其他顶点连接,就可以把多边形分割成三角形。
渲染一个凸多边形采用Assembler
的方式组装顶点数据。
分为以下几步实现:
- 将引擎中的
Sprite-simple
组装器拷贝出来,作为自己的组装器模板。 - 新建一个类继承
Sprite
,并设置它的组装器到自己的组装器 - 创建变量顶点数组,纹理数组。
- 编写组装器逻辑
直接看看代码吧:D
凸多边形的类。
接下来看组装器内修改部分。
处理顶点数据
缓存UV坐标,我们定义的纹理坐标是归一化到0-1,在更新数据时再根据实际的纹理坐标(合图)进行转换。
填充数据修改,顶点索引就从第一个点开始连接到各个顶点的三角形。
小结
实现折叠效果可以将问题分解成处理一个多边形的问题,并用assembler
实现合批渲染。
以上为白玉无冰使用 Cocos Creator 3.0.0
实现 "折纸效果!"
的技术分享。欢迎三连(点赞/在看/留言/分享)支持!
完整项目链接 - cocos store (100分)
当然也可以在号内找到所有教程项目的地址:D
原文链接
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!