用CocosCreator模拟书本翻页效果

本文主要探讨了如何使用CocosCreator来模拟书本翻页效果,分别介绍了通过使用贝塞尔曲线和verlet积分算法来模拟书页底边在翻页过程中的弯曲形变,最后通过自定义assembler传入更多的顶点,来将原本的书页纹理渲染成弯曲后的样子以达到模拟翻页的效果。

Demo引擎版本:v2.3.1

首先展示一下最终实现的效果:

书页在翻动的过程中会产生一定的弯曲形变,这就意味着在每一帧中,我们所看到的书页都具有不同的形状,如果使用序列帧动画来实现,就要对每一帧单独绘制一张图片,这样将产生大量的资源。如果能够通过代码来模拟,就可以避免资源问题。

所以,我们要解决的问题就变成了如何将原本的书页图片渲染成翻页过程中的弯曲状态呢?

我们先观察一下书页形变后的样子:

通过上面这张图,我们发现,可以将书页的形变简化成这样:

1.把书页的底边想象成一根绳子,固定左边的位置不变,拉着右边向左上方位移形成一条曲线。

2.将整个书页沿着这条曲线向上位移。

通过以上两个步骤,我们就可以模拟出书页在任何一个时刻的样子。不同时刻书页形态的区别实际上就是曲线的不同,只要能够获得任意时刻书页底边的那条曲线,就能模拟出翻页的效果。

那么,该如何获得那条曲线呢?这里提供两个方案。

(1)背景介绍

贝塞尔曲线是应用于二维图形应用程序的数学曲线,通过至少3个控制点,就可以描述出一条曲线。N阶贝塞尔曲线拥有N+1个控制点。

以3阶贝塞尔曲线为例,它的具体公式如下:

只要确定了起点P0,控制点P1,控制点P2和终点P3,就可以画出这样一条曲线,它将和P0P1、P2P3分别相切。

(2)实现

也就是说,只要找到任意时刻4个控制点的位置,我们就可以把书页底边的曲线模拟出来。当然,起点的位置其实是固定不变的(除非你把书页从书上撕下来)。

如果以终点与起点连线和水平面的夹角来描述翻页过程中的某一个具体的位置,那么我们可以观察书页在每一个角度的曲线形状,然后把控制点的位置推导出来,从而还原整个翻书过程,但这样显然是无法实现的。

我们只能先确定部分特殊角度的控制点,然后在这些控制点间做插值。

①选取几个特殊角度,获得控制点的位置,保证在这些特殊角度曲线的形状是较为真实的。

例如,在0°和180°时,我们获得的必然是一条直线,而在90°时,曲线大概是长这样:

②在特殊角度之间插值。

可以想象,均匀插值是不够真实的,以0°到90°为例,终点的运动轨迹应该是类似下图这样,x坐标的变换由慢到快,而y坐标的变换则是由快到慢。

选取一个合适的插值函数,就可以模拟出一个还不错的翻页效果:

使用贝塞尔曲线来模拟的最大问题在于,这种方法与真实的物理运动是没有关系的,它在某一个时刻的形状实际上是根据观察推测出的一个插值公式得到的。这就导致我们最终得到的曲线长度并不等于书页的宽度,所以在获得了曲线之后,我们还需要修正曲线长度与书页宽度一致,具体的实现会在后文提到。

考虑到贝塞尔曲线的缺点,我们需要一种更加接近真实物理运动规律的方法,也就是第二种实现方案——verlet积分算法。

(1)背景知识

质点弹簧系统:

模拟物体变形最简单的方法就是采用弹簧质点系统。在质点弹簧系统中,我们需要定义一系列的质点,也就是有质量的点,并假设质点之间存在一个拥有一定长度、质量为0的弹簧。当质点运动时,会受到内力和外力和影响,内力包括弹簧的弹性力和阻尼力,外力包括重力以及空气阻力等。

模拟物体的运动,实际上就是计算出物体在任意时刻的位置。在质点弹簧系统中,我们可以获得每个质点受到的力以及它的质量,根据牛顿第二定律,我们就可以算出质点的加速度。有了加速度,再通过一定的算法,就可以计算质点的位置。

显式欧拉积分算法:

显式欧拉积分是一种较为简单的算法。在显式欧拉积分中,下一时刻的状态由当前时刻的状态决定。显式欧拉积分的问题在于误差较大且不稳定,所以我们不予采用。

verlet积分算法:

verlet积分算法是一种基于位置的积分,通过质点在当前时刻和上一时刻的位置来计算出新的位置。verlet积分算法在精度和稳定性上都要优于显式欧拉积分算法,并且计算的复杂度相差不大。

约束:

假设质点间弹簧的弹力系数为无限大,那么当拉伸或压缩弹簧时,两个质点之间的距离总会保持在原来的长度。利用这种思想我们就可以通过增加质点间的距离约束来简化弹力的计算。

现在,我们把书页底边看作是由一些水平放置的质点连接而成。当我们移动尾质点的位置时,其他质点将会由于质点间弹簧的约束作用而跟着移动。这样,我们就可以使用一种较为真实的方法来获得一条曲线。

使用verlet积分来计算曲线的方法如下:

①首先根据书页的宽度来定义一系列水平放置的质点。

②在每一帧先根据verlet积分公式来更新每个质点的位置。

当前位置和上一个位置的差可以看作是质点的速度,由于空气阻力等造成的能量损耗,这里还需要额外乘上一个衰减系数。

加速度的影响这里可以简化为,一个竖直向下的重力。

③通过弹簧约束来修正质点的位置,修正的次数越多,效果也就越好,但同时带来的性能开销也就越大。

④添加一个移动尾质点的方法。

这里我们就使用和贝塞尔曲线相同的运动轨迹来做对比,可以看到使用verlet积分算法得到的结果要更加真实。

(3)参数对效果的影响

使用不同的参数值,会展现出不同的材质效果。影响verlet积分算法效果的参数主要有:速度衰减系数、重力和纠正次数。使用的时候需要通过调节参数来获得一个较为满意的效果。

速度衰减系数:

速度当前位置与上一个位置的差计算得到,可以看作是惯性的一种近似表现。当运动停止时,各个质点还会由于惯性继续运动下去。速度衰减系数越大,惯性就越大,模拟出的书页就会晃动的比较厉害。

重力:

重力会在每一帧将质点向下拉动一定距离,如果书页在水平方向运动的速度比较慢,就会表现出一种难以将书页拉起的感觉。

纠正次数:

纠正的次数越多,每两个质点之间的距离也就越接近初始的固定值,所以纠正次数会影响书页的柔软度。需要注意的,纠正次数越多,也就意味着更多的计算量,使用时应该均衡考虑。

1.如何将书页纹理渲染成沿着曲线向上位移后的样子?

涉及到渲染问题,我们首先得看一下渲染管线是如何工作的。

首先,顶点着色器会对我们传入的每个顶点进行处理,处理后的顶点将被组合成三角形,这些三角形经过光栅化会形成片段。最后,经过片段着色器的计算得到每个片段的颜色值。

简单来说,Sprite组件根据所在节点的宽、高、坐标、锚点等信息得到了由4个顶点围成的矩形,这个矩形最后显示到屏幕上时会变成许许多多个小的像素点,而每个像素点的颜色则是OpenGL根据片段的纹理坐标和Sprite使用的纹理采样得到的。

如果想要渲染出由曲线围成的书页图片,4个顶点显然是不够的。所以,我们需要自定义一个渲染组件来传入更多的顶点以完成需求:

①将书页的上下边分成若干条线段来拟合曲线,也就是在原本矩形的上下边的两个端点之间创建更多的顶点。

②连接上下边的顶点形成若干个三角形。

最终得到的图形可以看作是由若干个小的矩形拼接得到。显然顶点的数量越多,曲线也就越平滑。而经过前面的分析,每个顶点在任意时刻的坐标我们都可以轻易获得。

使用贝塞尔曲线方法直接套用贝塞尔公式即可得到,而verlet积分方法中的质点则刚好与这里的顶点一一对应。

如果把顶点数调低的话,就可以比较明显的看出各个小矩形的范围:

想要传入更多的顶点,就得自定义渲染组件和Assembler。

Assembler是指处理渲染组件顶点数据的一系列方法,每个渲染组件都拥有一个Assembler成员。Assembler中必须要定义updateRenderData及fillBuffers方法,前者需要更新准备顶点数据,后者则是将准备好的顶点数据填充进VetexBuffer和IndiceBuffer中。

2.修正贝塞尔曲线的长度

如果不对贝塞尔曲线做修正的话,在翻动过程中书页就会被拉宽或缩短:

由于贝塞尔曲线是推测得出的,所以最后获得的曲线长度与实际书页宽度并不相等。修正的方法也很简单,累加当前得到的每两个顶点之间的距离(也就是小矩形的宽度),如果大于真实宽度,就进行衰减处理,在最后一个顶点处进行多减少补,从而使得所有小矩形宽度之后等于真实宽度。

另一个需要注意的点是纹理坐标的计算,经过贝塞尔曲线公式计算后,顶点将不再是均匀分布,所以纹理坐标必须根据每个小矩形占总长度的比例来获得。如果使用等分来获得纹理坐标,效果将如下图所示:

3.背面纹理实现

在之前演示的效果图中可以看到,书页正反面的纹理是不一样的,这个是如何实现的呢?这里提供两种思路。

①背面剔除

通过设置背面剔除,OpenGL会根据节点的环绕顺序来识别正面和背面,并将所有背面的顶点都剔除掉,不参与最终的渲染。

只要使用两个节点来分别表示书页正面和背面,并一个剔除掉背面,一个剔除掉正面,即可拼出最终的图像。但还需要考虑到正面和背面的层级问题,在贝塞尔曲线的实现中,背面始终在正面的层级之上,但verlet积分算法实现的效果中就显然不是这样了,有时甚至会出现一个面穿插在另一个面中的情况:

所以背面剔除的方法具有一定的局限性。

②自定义shader

另一种方法是创建一个自定义shader,传入两张纹理,并增加一个新的顶点属性来告诉片段着色器应该对哪一张纹理进行采样。

判断一个小矩形应该使用正面纹理还是反面纹理其实很简单,只要通过前后两个顶点的x坐标来判断就行,后一个顶点的x坐标大则为正。而由于后绘制的顶点本身就会覆盖前面的顶点,所以使用这种方法就不用考虑层级的问题了。

贝塔所在的乐府互娱,是一家专注于精品移动游戏研发和运营的明星初创企业。核心团队是《少年三国志》《少年西游记》系列作品的原班人马,长期深耕卡牌手游等品类,打造过数款月流水过亿的产品,包括《少年三国志》《少年西游记》等,游戏累计流水近100亿元。目前正在高薪招聘CocosCreator开发工程师,感兴趣的小伙伴可以扫下方二维码了解详情哟!

THE END
1.人工智能51CTO.COM2024-12-17 13:08:20 AI算法图像宇树机器人强化学习代码全面开源,还有训练到仿真和实操手把手教学 一开始,宇树开源的是英伟达Issac Gym平台上的训练代码,这次新增了对MuJoCo模拟仿真的支持。 2024-12-17 13:00:00 训练代码机器人语言游戏让AI自我进化,谷歌DeepMind推出苏格拉底式学习 近日,谷歌DeepMind的研究人员https://ai.51cto.com/
2.数据结构和算法动态可视化网站算法动态模拟网站文章浏览阅读217次。VisuAlgo_算法动态模拟网站https://blog.csdn.net/weixin_44142151/article/details/111559494
3.自考《电子商务网站设计原理》实践考核模拟题汇总自考摘要:本文为大家提供自考《电子商务网站设计原理》实践考核模拟题汇总,对自考《电子商务网站设计原理》专业实践考核的题型还不清楚的小伙伴赶紧做做题练练手吧! 本文为大家提供自考《电子商务网站设计原理》实践考核模拟题汇总,对自考《电子商务网站设计原理》专业实践考核的题型还不清楚的小伙伴赶紧做做题练练手吧! https://www.educity.cn/zikao/145537.html
4.MaterialsStudio建模与材料模拟计算工作站方案2021v4重点(1)Materials Studio材料模拟软件计算特点 (2)Materials Studio三维建模/可视化硬件配置推荐 (3)Materials Studio量子力学工作站硬件配置推荐 (4)Materials Studio分子力学与分子动力工作站硬件配置推荐 (一)Materialshttp://www.xasun.com/article/b5/2464.html
5.python使用rsa加密算法模块模拟新浪微博登录pythonpython使用rsa加密算法模块模拟新浪微博登录 PC登录新浪微博时,在客户端用js预先对用户名、密码都进行了加密,而且在POST之前会GET一组参数,这也将作为POST_DATA的一部分。这样,就不能用通常的那种简单方法来模拟POST登录(比如人人网)。 通过爬虫获取新浪微博数据,模拟登录是必不可少的。https://www.jb51.net/article/46053.htm
6.上海自考数字媒体艺术概论(14265)自学考试大纲2.领会运用数学规律或算法模拟自然规律生成形状,3D 打印技术能够将其从虚拟变为现实。 3.领会 3D 打印技术的应用领域,识记典型艺术家和作品。 (十二)数字媒体软件与设计 领会数字媒体软件的概念,识记其 5 个类别,以及每个类别所包括的主要设计软件及其特点和应用。 https://www.zikaoben.cn/n/e-9719833081.html
7.人脸识别让寻亲不再是大海捞针人脸识别+人脸模拟算法 缩小寻亲范围 “人工智能在帮助寻亲方面的优势不言而喻。”第十三届全国人大代表、宝贝回家寻子网创始人张宝艳对此充满期待。她说:“以前寻亲,只能一张张翻看、对比照片,当看过成千上万张照片时,人就迷糊了,准确率低。目前,我们网站已登记超过8万份走失者资料,利用人工智能,能够瞬间从这些资https://news.cctv.com/m/a/index.shtml?spm=C94212.P4wBUp7E2r8M.S73105.32&id=ARTIN5DpZaSaXUoDBs0pc8d8190610
8.盘点程序员常用的15个宝藏级网站,强烈建议收藏!GitHub作为最知名的开发者网站,本身是一个面向开源及私有软件项目的托管平台,可以在上面搜到许多优秀的开源项目,包括Apple、Google、Microsof等很多知名互联网公司,都在上面开源过自己公司的项目。 3、VisuAlgo VisuAlgo创建于2011年,是一个数据结构和算法动态可视化网站。里面包含了程序员必学的数据结构和算法,比如排序https://zhuanlan.zhihu.com/p/659846831
9.简单模拟算法(1)viewts简单模拟算法(1) 使用过python的pyautogui库的应该都知道官方文档有一个这样的例子: 源码如下: 1importpyautogui23distance = 2004whiledistance >0:5pyautogui.dragRel(distance, 0, duration = 0.5)#右6distance -= 107pyautogui.dragRel(0, distance, duration = 0.5)#下8pyautogui.dragRel(-distance, 0https://www.cnblogs.com/viewts/p/11070314.html
10.旧金山大学数据结构与算法可视化网站Basics Stack: Array Implementation Stack: Linked List Implementation Queues: Array Implementation Queues: Linked List Implementation Lists: Array Implementation (available injavaversion) Lists: Linked List Implementation (available injavaversion) Recursion https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
11.神经网络计算机器学习计算遗传算法模糊计算群智能计算当然,智能计算的这些不同研究领域和算法各有各的特点,虽然它们具有模仿人类和生物智能的共同点,但是在具体实现方法上还存在一些不同点。例如人工神经网络模仿人脑的生理构造和信息处理的过程,模拟人类的智慧;模糊计算模仿人类语言和思维中的模糊性概念,也是模拟人类的智慧;进化计算模仿生物进化过程和群体智能过程,模拟大https://www.chinaagv.com/news/detail/201901/7763.html
12.遗传算法原理及其应用.pdf用心打造免费、绿色、专业、海量的教育文库网站 本文档来源于第一文库网:/view/9713DE425B686CA 3.html 二. 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化 概率 搜索算法。 2.1 遗传算法概要 对于一个求函数最大值的优化问题(求函数最小值也类同),一般可描述为下述https://max.book118.com/html/2021/0226/7161120004003061.shtm
13.科学网—CodingandPaperLetter(六十九)40.WebAssembly随机模拟算法 wassa 41.使用python和matplotlib进行科学可视化的开放式访问书。 scientific visualization book 42.一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac。 baidu netdisk downloaderx 43.hugo网页主题whisper。 hugo whisper theme https://blog.sciencenet.cn/blog-3247241-1194852.html
14.操作系统虚拟存储管理页面置换算法该程序主要实现了FIFO算法来模拟页面置换过程。 首先,定义了几个常量和结构体,包括页表项和页表项链表的结构。 初始化函数initialize用于初始化页表项和页表项链表,并设置了空闲页面帧和正在使用的页面帧的头节点。 FIFO函数实现了FIFO算法的页面置换过程。该算法的思想是,若所需页面不在内存中,则将内存中的最早进入https://developer.aliyun.com/article/1410793
15.算法如何确定图(Graph)里有没有环(Cycle)?人肉模拟运行算法 我们来找两个例子,按照算法模拟运行一下。 第一个例子 先看图一,图一中节点1,2,3的度是2,节点4和5的度是3,而节点6和7的度是1。 那首先,我们要把节点6和7放到队列里。 然后将节点6弹出,把和节点6相邻的节点5的度减一。从图上,就相当于擦掉了节点5和节点6之间的边。按理说此时节点https://cloud.tencent.com/developer/article/1825193
16.机器博弈(三)虚拟遗憾最小化算法如果不能遍历计算机所有节点的遗憾值,那么可以采用虚拟遗憾最小化算法来进行模拟计算。 假设: 集合 是博弈中所有玩家所能采用的行为集(如在石头-剪刀-布游戏中出石头、出剪刀或出布三种行为) 为信息集,包含了博弈的规则以及玩家采取的历史行动,在信息集 https://www.jianshu.com/p/ad4f121b69ef
17.优化算法黑洞模拟算法(MVO)含Matlab源码479期多元宇宙优化算法(Multi-Verse Optimizer,MVO)是Seyedali Mirjalili等于2016年提出的一种新型智能优化算法[1]。它基于宇宙中的物质通过虫洞由白洞向黑洞进行转移的原理进行模拟。在MVO算法中,主要的性能参数是虫洞存在概率和虫洞旅行距离率,参数相对较少,低维度数值实验表现出了相对较优异的性能。 1 算法原理 该算法主https://sdk.cn/details/DJRrM6gmd43y8eo4mE
18.面向国产神威超级计算机的分子动力学模拟算法优化因此,对分子动力学相关的模拟算法的优化研究势在必行。本文的主要工作是以分子动力学模拟软件大规模原子/分子并行模拟器(Large-scale Atomic/Molecular Massively Parallel Simulator,LAMMPS)为切入点,在国产神威系列超级计算机上进行分子动力学模拟算法的优化研究。首先,本文在“神威·太湖之光”超级计算机上对LAMMPS中的http://cnki.nbsti.net/KCMS/detail/detail.aspx?filename=1022025486.nh&dbcode=CDFD
19.LoRaWAN网络服务器算法下行路径选择算法对比与仿真(下)算法一仅判断信号质量,不判断负载情况,最右处网关在已有17.5%的上行负载时依然需要处理26.9%的下行负载。 算法二在上一个模拟场景中暴露出负载权重过大的缺陷,本场景中未改变负载权重。可以看出相对于算法一,算法二由于网关负载在加权求和的算法中占有一定权重,已经起到了一定效果,将网关4的下行负载降低了一些,但是在https://www.elecfans.com/d/2405920.html
20.PG·麻将胡了(试玩游戏)官方网站·模拟器·模拟器今日发布『模拟器pg麻将胡了』腾辉推荐支持:64/128bit系统类型:体育APP|今日发布现在下载,新用户还送新人!此款游戏是一款好玩的休闲益智类游戏,游戏的画面很是精致,简简单单的操作方法,玩家可以将方块堆到上面,很是考验玩家反应力,玩起来http://zmt666.com/
21.飞行器水载荷结构完整性数值模拟现状与展望南京航空航天大学孙建红团队[108]采用LS-DYNA的ALE算法模拟了带气囊直升机的水上迫降过程(图17),并分析了入水速度、姿态角和气囊安装位置对冲击过载的影响。结果表明:下沉速度对冲击载荷影响显著,而水平速度对冲击载荷影响较小;加装气囊能降低入水的冲击加速度峰值;最佳入水迎角为8°。 https://www.fx361.com/page/2021/0616/11519482.shtml
22.pg模拟器(试玩游戏)官方网站·模拟器/试玩平台【信誉推荐】pg模拟器试玩入口支持:64/128bit,系统类型:pg模拟器试玩入口App官方下载(2024全站)最新版本9.17.18(?安全平台)pg模拟器试玩入口是一家提供绿色安全应用与游戏的安全下载市场,商店上汇聚了海量更新更全的ios-Android软件,ios-Androidhttp://qyslw.gsetc.com.cn/