cocos2dx Animate3D (一)
3D相关的动画都是继承Grid3DAction
本质上是用GirdBase进行创建动画的小块。
Shaky3D
晃动特效

// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列
// 晃动的范围
// z轴是否晃动
static Shaky3D* create(float initWithDuration, const Size& gridSize, int range, bool shakeZ);
关键实现
void Shaky3D::update(float /*time*/)
{int i, j;for (i = 0; i < (_gridSize.width+1); ++i){for (j = 0; j < (_gridSize.height+1); ++j){Vec3 v = getOriginalVertex(Vec2(i ,j));v.x += (rand() % (_randrange*2)) - _randrange;v.y += (rand() % (_randrange*2)) - _randrange;if (_shakeZ){v.z += (rand() % (_randrange*2)) - _randrange;}setVertex(Vec2(i, j), v);}}
}
示例代码
cc.Shaky3D:create(5, cc.size(15,10), 5, false)
Waves3D
波浪特效

// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列
// 波动的速率
// 振幅
static Waves3D* create(float duration, const Size& gridSize, unsigned int waves, float amplitude);
源码
void Waves3D::update(float time)
{int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i ,j));v.z += (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * 0.01f) * _amplitude * _amplitudeRate);//CCLOG("v.z offset is %f\n", (sinf((float)M_PI * time * _waves * 2 + (v.y+v.x) * .01f) * _amplitude * _amplitudeRate));setVertex(Vec2(i, j), v);}}
}
示例
cc.Waves3D:create(5, cc.size(15,10), 5, 40)
FlipX3D
X轴翻转动画

// 反转时间
static FlipX3D* create(float duration);
源码
void FlipX3D::update(float time)
{float angle = (float)M_PI * time; // 180 degreesfloat mz = sinf(angle);angle = angle / 2.0f; // x calculates degrees from 0 to 90float mx = cosf(angle);Vec3 v0, v1, v, diff;v0 = getOriginalVertex(Vec2(1.0f, 1.0f));v1 = getOriginalVertex(Vec2());float x0 = v0.x;float x1 = v1.x;float x;Vec2 a, b, c, d;if ( x0 > x1 ){// Normal Grida.setZero();b.set(0.0f, 1.0f);c.set(1.0f, 0.0f);d.set(1.0f, 1.0f);x = x0;}else{// Reversed Gridc.setZero();d.set(0.0f, 1.0f);a.set(1.0f, 0.0f);b.set(1.0f, 1.0f);x = x1;}diff.x = ( x - x * mx );diff.z = fabsf( floorf( (x * mz) / 4.0f ) );// bottom-leftv = getOriginalVertex(a);v.x = diff.x;v.z += diff.z;setVertex(a, v);// upper-leftv = getOriginalVertex(b);v.x = diff.x;v.z += diff.z;setVertex(b, v);// bottom-rightv = getOriginalVertex(c);v.x -= diff.x;v.z -= diff.z;setVertex(c, v);// upper-rightv = getOriginalVertex(d);v.x -= diff.x;v.z -= diff.z;setVertex(d, v);
}
示例
cc.FlipX3D:create(3)
FlipY3D
Y轴翻转动画

// 时间
static FlipY3D* create(float duration);
源码
void FlipY3D::update(float time)
{float angle = (float)M_PI * time; // 180 degreesfloat mz = sinf( angle );angle = angle / 2.0f; // x calculates degrees from 0 to 90float my = cosf(angle);Vec3 v0, v1, v, diff;v0 = getOriginalVertex(Vec2(1.0f, 1.0f));v1 = getOriginalVertex(Vec2());float y0 = v0.y;float y1 = v1.y;float y;Vec2 a, b, c, d;if (y0 > y1){// Normal Grida.setZero();b.set(0.0f, 1.0f);c.set(1.0f, 0.0f);d.set(1.0f, 1.0f);y = y0;}else{// Reversed Gridb.setZero();a.set(0.0f, 1.0f);d.set(1.0f, 0.0f);c.set(1.0f, 1.0f);y = y1;}diff.y = y - y * my;diff.z = fabsf(floorf((y * mz) / 4.0f));// bottom-leftv = getOriginalVertex(a);v.y = diff.y;v.z += diff.z;setVertex(a, v);// upper-leftv = getOriginalVertex(b);v.y -= diff.y;v.z -= diff.z;setVertex(b, v);// bottom-rightv = getOriginalVertex(c);v.y = diff.y;v.z += diff.z;setVertex(c, v);// upper-rightv = getOriginalVertex(d);v.y -= diff.y;v.z -= diff.z;setVertex(d, v);
}
示例
cc.FlipY3D:create(3)
Lens3D
凸镜特效

// 持续时间(时间过后不会回到原来的样子)
// 网格大小
// 凸镜中心点
// 半径
static Lens3D* create(float duration, const Size& gridSize, const Vec2& position, float radius);
源码
void Lens3D::update(float /*time*/)
{if (_dirty){int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));Vec2 vect = _position - Vec2(v.x, v.y);float r = vect.getLength();if (r < _radius){r = _radius - r;float pre_log = r / _radius;if ( pre_log == 0 ) {pre_log = 0.001f;}float l = logf(pre_log) * _lensEffect;float new_r = expf( l ) * _radius;if (vect.getLength() > 0){vect.normalize();Vec2 new_vect = vect * new_r;v.z += (_concave ? -1.0f : 1.0f) * new_vect.getLength() * _lensEffect;}}setVertex(Vec2(i, j), v);}}_dirty = false;}
}
示例
cc.Lens3D:create(2, cc.size(15,10), cc.p(size.width/2,size.height/2), 240)
Ripple3D
水波特效

// 持续时间(时间过后不会回到原来的样子)
// 网格大小
// 凸镜中心点
// 半径
// 波动的速率
// 振幅
static Ripple3D* create(float duration, const Size& gridSize, const Vec2& position, float radius, unsigned int waves, float amplitude);
源码
void Ripple3D::update(float time)
{int i, j;for (i = 0; i < (_gridSize.width+1); ++i){for (j = 0; j < (_gridSize.height+1); ++j){Vec3 v = getOriginalVertex(Vec2(i, j));Vec2 vect = _position - Vec2(v.x,v.y);float r = vect.getLength();if (r < _radius){r = _radius - r;float rate = powf(r / _radius, 2);v.z += (sinf( time*(float)M_PI * _waves * 2 + r * 0.1f) * _amplitude * _amplitudeRate * rate);}setVertex(Vec2(i, j), v);}}
}
示例
// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列
// 波动的速率
// 振幅
cc.Ripple3D:create(t, cc.size(32,24), cc.p(size.width/2,size.height/2), 240, 4, 160)
Liquid
液体特效

// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列
// 波动的速率
// 振幅
static Liquid* create(float duration, const Size& gridSize, unsigned int waves, float amplitude);
源码
void Liquid::update(float time)
{int i, j;for (i = 1; i < _gridSize.width; ++i){for (j = 1; j < _gridSize.height; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate));v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.y * .01f) * _amplitude * _amplitudeRate));setVertex(Vec2(i, j), v);}}
}
示例
cc.Liquid:create(3, cc.size(16,12), 4, 20)
Waves
带方向的波浪特效,水平与垂直

// 持续时间(时间过后不会回到原来的样子)
// 整个屏幕被分成几行几列
// 波动的速率
// 振幅
// 是否是水平方向
// 是否是垂直方向
static Waves* create(float duration, const Size& gridSize, unsigned int waves, float amplitude, bool horizontal, bool vertical);
源码
void Waves::update(float time)
{int i, j;for (i = 0; i < _gridSize.width + 1; ++i){for (j = 0; j < _gridSize.height + 1; ++j){Vec3 v = getOriginalVertex(Vec2(i, j));if (_vertical){v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.y * .01f) * _amplitude * _amplitudeRate));}if (_horizontal){v.y = (v.y + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate));}setVertex(Vec2(i, j), v);}}
}
例子
cc.Waves:create(2, cc.size(16,12), 4, 20, true, true)
相关文章:
cocos2dx Animate3D (一)
3D相关的动画都是继承Grid3DAction 本质上是用GirdBase进行创建动画的小块。 Shaky3D 晃动特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 晃动的范围 // z轴是否晃动 static Shaky3D* create(float initWithDuration, const Size& …...
2023年最新PyCharm环境搭建教程(含Python下载安装)
文章目录 写在前面PythonPython简介Python生态圈Python下载安装 PyCharmPyCharm简介PyCharm下载安装PyCharm环境搭建 写在后面 写在前面 最近博主收到了好多小伙伴的吐槽称不会下载安装python,博主听到后非常的扎心,经过博主几天的熬夜加班,…...
3D火山图绘制教程
一边学习,一边总结,一边分享! 本期教程内容 **注:**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形,在前面的推文中,我们也推出了好几期火山图的绘制教程࿰…...
跳跃游戏[中等]
优质博文:IT-BLOG-CN 一、题目 给你一个非负整数数组nums,你最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返…...
华为昇腾开发板共享Windows网络上网的方法
作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 具体参考文章:linux(内网)通过window 上网。具体是两步:一是在windows上设置internet连接共享。二是打开Atlas 200I D…...
【工具栏】热部署不生效
目录 配置热部署: 解决热部署不生效: 首先检查: 第一步: 第二步: 第三步: 第四步: 配置热部署: https://blog.csdn.net/m0_67930426/article/details/133690559 解决热部署不…...
一键去水印免费网站快速无痕处理图片、视频水印
水印问题往往是一个大麻烦。即使我们只想将这些照片保留在我们的个人相册中以供怀旧,水印也可能像顽固的符号一样刺激我们的眼睛。为了解决这个问题,我们需要不断探索创新的解决方案,让我们深入研究一款强大的一键去水印免费网站“水印云”。…...
分片并不意味着分布式
Sharding(分片)是一种将数据和负载分布到多个独立的数据库实例的技术。这种方法通过将原始数据集分割为分片来利用水平可扩展性,然后将这些分片分布到多个数据库实例中。 1*yg3PV8O2RO4YegyiYeiItA.png 但是,尽管"分布"…...
Python中的函数
一、函数参数与返回值基础知识 1、不要使用可变类型(list等)作为参数默认值,用None来代替。 参数默认值只会在函数定义阶段被创建一次,之后无论创建多少次,函数内拿到的默认值都是同一个对象,为规避这个问…...
推荐一款png图片打包plist工具pngPackerGUI_V2.0
png图片打包plist工具,手把手教你使用pngPackerGUI_V2.0 此软件是在pngpacker_V1.1软件基础之后,开发的界面化操作软件,方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件,得到如下目录,双击打开 pngPackerGUI.…...
Docker快速安装Mariadb11.1
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。 Mari…...
CuratorFrameworkFactory.builder()方法可配置属性
CuratorFrameworkFactory.builder()方法可以配置以下属性: 1. connectString:ZooKeeper服务器的连接字符串。 2. sessionTimeoutMs:ZooKeeper会话超时时间。 3. connectionTimeoutMs:ZooKeeper连接超时时间。 4. retryPolicy&…...
鸿蒙 ark ui 轮播图实现教程
前言: 各位同学有段时间没有见面 因为一直很忙所以就没有去更新博客。最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 具体实现 我们在鸿蒙的ark ui 里面列表使…...
看不惯AI版权作品被白嫖!Stability AI副总裁选择了辞职,曾领导开发Stable Audio
近日,OpenAI的各种大瓜真是让人吃麻了。 而就在Sam Altmam被开除前两天,可能没太多人注意到Stability AI副总裁Newton—Rex因看不惯StabilityAI在版权保护上的行为选择辞职一事。 大模型研究测试传送门 GPT-4传送门(免墙,可直接…...
基于Python+OpenCV+Tensorflow图像迁移的艺术图片生成系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于PythonOpenCVTensorfl…...
leetcode 32最长有效括号 34在排序数组中查找元素的第一个和最后一个位置
32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2&a…...
【附代码】判断线段是否相交算法(Python,C++)
【附代码】判断线段是否相交算法(Python,C) 文章目录 【附代码】判断线段是否相交算法(Python,C)相关文献测试电脑配置基础向量旋转向量缩放向量投影推导 点乘定义推导几何意义 叉乘定义推导几何意义 判断线…...
PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 word、HTML、SVG、XPS
本文我们将演示如何通过调用 Spire.PDF 提供的方法 PdfDocument.SaveToStream() 将 PDF 页面转换为 HTML、Word、SVG、XPS、PDF 并将它们保存到流中。并且从Spire.PDF版本4.3开始,它新支持转换定义范围的PDF页面并将其保存到流中。 Spire.Doc 是一款专门对 Word 文…...
【FLink】水位线(Watermark)
目录 1、关于时间语义 1.1事件时间 1.2处理时间编辑 2、什么是水位线 2.1 顺序流和乱序流 2.2乱序数据的处理 2.3 水位线的特性 3 、水位线的生成 3.1 生成水位线的总体原则 3.2 水位线生成策略 3.3 Flink内置水位线 3.3.1 有序流中内置水位线设置 3.4.2 断点式…...
github访问不了问题
git clone github上的项目的时候,不是访问不了,就是克隆过程被中断了 最近找到一个代理,从代理那里clone而不是github上 GitHub代理 – 初果编程...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
