QT高级运用之粒子模拟(Particle Simulations)
粒⼦模拟是计算机图形技术的可视化图形效果。典型的效果有:落叶,⽕焰,爆炸,流星,云等等。它不同于其它图形渲染, 粒⼦是基于模糊来渲染。它的结果在基于像素下是不可预测的。粒⼦系统的参数描述了随机模拟的边界。传统的渲染技术实现粒⼦渲染效果很困难。有⼀个好消息是你可以使⽤QML元素与粒⼦系统交互。同时参数也可以看做是属性,这些参数可以使⽤传统的动画技术来实现动态效果。
概念(Concept)
粒⼦模拟的核⼼是粒⼦系统(ParticleSystem),它控制了共享时间线。⼀个场景下可以有多个粒⼦系统,每个都有⾃⼰独⽴的时间线。⼀个粒⼦使⽤发射器元素(Emitter)发射,使⽤粒⼦画笔(ParticlePainter)实现可视化, 它可以是⼀张图⽚,⼀个QML项或者⼀个着⾊项(shader item)。⼀个发射器元素( Emitter) 也提供向量来控制粒⼦⽅向。 ⼀个粒⼦被发送后就再也⽆法控制。 粒⼦模型提供粒⼦控制器( Affector) , 它可以控制已发射粒⼦的参数。
在⼀个系统中, 粒⼦可以使⽤粒⼦群元素( ParticleGroup) 来共享移动时间。 默认下, 每个例⼦都属于空( “”) 组。

- 粒⼦系统(ParticleSystem) - 管理发射器之间的共享时间线。
- 发射器(Emitter) - 向系统中发射逻辑粒⼦。
- 粒⼦画笔(ParticlePainter) - 实现粒⼦可视化。
- ⽅向(Direction) - 已发射粒⼦的向量空间。
- 粒⼦组(ParticleGroup) - 每个粒⼦是⼀个粒⼦组的成员。
- 粒⼦控制器( Affector) - 控制已发射粒⼦。
简单的模拟( Simple Simulation)
让我们从⼀个简单的模拟开始学习。Qt Quick使⽤简单的粒⼦渲染⾮常简单。下⾯是我们需要的:
- 绑定所有元素到⼀个模拟的粒⼦系统( ParticleSystem) 。
- ⼀个向系统发射粒⼦的发射器( Emitter) 。
- ⼀个ParticlePainter派⽣元素, ⽤来实现粒⼦的可视化。
importQtQuick2.6importQtQuick.Window2.2importQtQuick.Particles2.0Window{visible:true;id: root;width:480;height:160;color:"#1f1f1f";ParticleSystem{id: particleSystem;}Emitter{id: emitter;anchors.centerIn: parent;width:160;height:80;system: particleSystem;emitRate:10;//每S发送10个粒子lifeSpan:2000;//每个粒子生命周期为1000mslifeSpanVariation:500;//一个已发射粒子的生命周期变化是500mssize:16;//一个粒子开始的大小是16像素endSize:32;//生命周期结束时的大小是32个像素( endSize:32)// Tracer {colro: "green"};}ImageParticle{source:"/blur.png";system: particleSystem;}}
运⾏结果如下所⽰:
我们使⽤⼀个480x160的矩形框作为我们的根元素和背景。 然后我们定义⼀个粒⼦系统(ParticleSystem)。这通常是粒⼦系统绑定所有元素的第⼀步。 下⼀个元素是发射器( Emitter),它定义了基于矩形框的发射区域和发射粒⼦的基础属性。发射器使⽤system属性与粒⼦系统进⾏绑定。
在这个例⼦中,发射器每秒发射10个粒⼦( emitRate:10) 到发射器的区域,每个粒⼦的⽣命周期是1000毫秒( lifeSpan:1000) , ⼀个已发射粒⼦的⽣命周期变化是500毫秒( lifeSpanVariation:500) 。 ⼀个粒⼦开始的⼤⼩是16个像素( size:16) , ⽣命周期结束时的⼤⼩是32个像素( endSize:32) 。
发射器发射逻辑粒⼦。⼀个逻辑粒⼦的可视化使⽤粒⼦画笔( ParticlePainter) 来实现, 在这个例⼦中我们使⽤了图像粒⼦( ImageParticle),使⽤⼀个图⽚链接作为源属性。
图像粒⼦也有其它的属性⽤来控制粒⼦的外观。
- 发射频率( emitRate) - 每秒粒⼦发射数( 默认为10个) 。
- ⽣命周期( lifeSpan) - 粒⼦持续时间( 单位毫秒, 默认为1000毫秒) 。
- 初始⼤⼩( size),结束⼤⼩( endSize)- 粒⼦在它的⽣命周期的开始和结束时的⼤⼩( 默认为16像素)。
粒⼦参数( Particle Parameters)
我们已经知道通过改变发射器的⾏为就可以改变我们的粒⼦模拟。粒⼦画笔被⽤来绘制每⼀个粒⼦。 回到我们之前的粒⼦中, 我们更新⼀下我们的图⽚粒⼦画笔( ImageParticle)。⾸先我们改变粒⼦图⽚为⼀个⼩的星形图⽚:
粒⼦使⽤⾦⾊来进⾏初始化, 不同的粒⼦颜⾊变化范围为+/- 20%。
color:'#FFD700'colorVariation:0.2
为了让场景更加⽣动, 我们需要旋转粒⼦。 每个粒⼦⾸先按顺时针旋转15度, 不同的粒⼦在+/-5度之间变化。 每个例⼦会不断的以每秒45度旋转。每个粒⼦的旋转速度在+/-15度之间变化:
rotation:15rotationVariation:5rotationVelocity:45rotationVelocityVariation:15
最后, 我们改变粒⼦的⼊场效果。 这个效果是粒⼦产⽣时的效果, 在这个例⼦中, 我们希望使⽤⼀个缩放效果:
entryEffect: ImageParticle.Scale
现在我们可以看到旋转的星星出现在我们的屏幕上。
代码:
importQtQuick2.6importQtQuick.Window2.2importQtQuick.Particles2.0Window{visible:true;id: root;width:480;height:160;color:"black";ParticleSystem{id: particleSystem;}Emitter{id: emitter;anchors.centerIn: parent;width:160;height:80;system: particleSystem;emitRate:10;//每S发送10个粒子lifeSpan:1000;//每个粒子生命周期为1000mslifeSpanVariation:500;//一个已发射粒子的生命周期变化是500mssize:16;//一个粒子开始的大小是16像素endSize:32;//生命周期结束时的大小是32个像素( endSize:32)// Tracer {colro: "green"};}ImageParticle{source:"/start.bmp";color:"#ffd700";colorVariation:0.2rotation:15rotationVariation:5rotationVelocity:45rotationVelocityVariation:15entryEffect:ImageParticle.Scalesystem: particleSystem;}}
粒⼦⽅向( Directed Particle)
我们已经看到了粒⼦的旋转, 但是我们的粒⼦需要⼀个轨迹。 轨迹由速度或者粒⼦随机⽅向的加速度指定, 也可以叫做⽮量空间。
有多种可⽤⽮量空间⽤来定义粒⼦的速度或加速度:
- ⾓度⽅向( AngleDirection) - 使⽤⾓度的⽅向变化。
- 点⽅向( PointDirection) - 使⽤x,y组件组成的⽅向变化。
- 目标⽅向( TargetDirection) - 朝着目标点的⽅向变化。
让我们在场景下试着⽤速度⽅向将粒⼦从左边移动到右边。
⾸先使⽤⾓度⽅向( AngleDirection) 。 我们使⽤AngleDirection元素作为我们的发射器( Emitter) 的速度属性。
velocity:AngleDirection{}
粒⼦的发射将会使⽤指定的⾓度属性。 ⾓度值在0到360度之间, 0度代表指向右边。 在我们的例⼦中, 例⼦将会移动到右边, 所以0度已经指向右边⽅向。 粒⼦的⾓度变化在+/-15度之间:
velocity:AngleDirection{angle:0angleVariation:15}
现在我们已经设置了⽅向, 下⾯是指定粒⼦的速度。 它由⼀个梯度值定义,这个梯度值定义了每秒像素的变化。 正如我们设置⼤约640像素, 梯度值为100, 看起来是⼀个不错的值。 这意味着平均⼀个6.4秒⽣命周期的粒⼦可以穿越我们看到的区域。 为了让粒⼦的穿越看起来更加有趣, 我们使⽤magnitudeVariation来设置梯度值的变化, 这个值是我们的梯度值的⼀半:
velocity:AngleDirection{...magnitude:100magnitudeVariation:50}

粒⼦画笔( Particle Painter)
粒⼦控制( Affecting Particles)
粒⼦组( Particle Group)
总结( Summary)
未完待续。。。。。
QT高级运用之粒子模拟(Particle Simulations)的更多相关文章
- Cocos2d-x 粒子编辑器 Particle Studio 争做 Windows Particle Designer 源代码
1.Particle Studio介绍 非常早发现一款粒子编辑器叫Particle Designer,不知道为什么它没有Windows版本号. 所以我就在Windows下基于Qt做了一个粒子编辑器.之 ...
- OpenGL小试牛刀第二季(粒子模拟)
效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numpar ...
- Qt高级——QTestLib单元测试框架
一.QTestLib简介 1.QTestLib简介 QTestLib是Qt提供的一种针对基于Qt编写的程序或库的单元测试框架.QTestLib提供了单元测试框架的基本功能,并提供了针对GUI测试的扩展 ...
- Qt高级编程 高清PDF+源|网盘下载地址附提取码|
书籍作者:Mark Summerfield(马克 . 萨默菲尔德)(英) 书籍译者:闫锋欣内容简介:本书是一本阐述Qt高级编程技术的书籍.本书以工程实践为主旨,是对Qt现有的700多个类和上百万字 ...
- QT:“下载速度柱状图”的模拟实现——思路真好,会动脑筋,连我都有了启发(这个思路好像是通用的)
不知是哪个版本的迅雷,有个“下载速度柱状图”的小界面,我比较喜欢(只不过最新版本的迅雷却没了),所以决定来山寨一个.当然,这个山寨品不能下载文件,呵呵. 思路:1:将界面的背景涂成黑色2:每隔0.1秒 ...
- 机器学习理论基础学习14.2---线性动态系统-粒子滤波 particle filter
一.背景 与卡曼滤波不同的是,粒子滤波假设隐变量之间(隐变量与观测变量之间)是非线性的,并且不满足高斯分布,可以是任意的关系. 求解的还是和卡曼滤波一样,但由于分布不明确,所以需要用采样的方法求解. ...
- 理解粒子滤波(particle filter)
1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...
- (转)粒子编辑器Particle designer属性的介绍
转载:http://blog.csdn.net/ym19860303/article/details/9210539 Particle designer粒子编辑器可到这里下载(包含授权码):http: ...
- 粒子滤波particle filter和目标跟踪
粒子滤波用于跟踪,参考:http://www.cnblogs.com/tornadomeet/archive/2012/03/18/2404817.html http://blog.csdn.net/ ...
随机推荐
- PHP之intval()
Title:PHP之intval() --2014-02-26 13:57 <?php ...... $a='0x2720616e6420313d3220756e696f6e2073656c6 ...
- 【技术贴】xp下改变7zip默认关联图标和美化教程
今天发现7z被还原成了复古样式,就是那种win2000的图标,感觉果然是技术人员做的美工. 于是开始想办法替换掉,自己找到了一个最简单的办法 首先,默认用7z打开 1.随便找到一个7z后缀,然后右键, ...
- Red Hat TimesTen安装记录
1:内核参数修改 # vi /etc/sysctl.conf kernel.sem= #sysctl –p 备注:此安装过程为测试环境,具体参数修改要参考TimesTen官方文档. 2:创建用户及组信 ...
- hdu 3400 Line belt
题意:给你两条线段AB,CD:然后给你在AB,CD上的速度P,Q,在其它部分的速度是R,然后求A到D的最短时间. 思路:用三分枚举从AB线段上离开的点,然后再用三分枚举在CD的上的点找到最优点,求距离 ...
- MYSQL用SOURCE命令时导入乱码的问题解决
现在遇到了,但记得上次辉哥说过的方法,在MYSQL命令行里输入: set names utf8; 再执行SOURCE命令,搞定!
- CMOS和TTL的區別
TTL電路是晶體管-晶體管邏輯電路的英文縮寫(Transister-Transister-Logic ),是數字集成電路的一大門類.它采用雙極型工藝制造,具有高速度低功耗和品種多等特點. CMOS是: ...
- UVA11388 GCD LCM(数论)
题目链接. 题意: 给定两个数,一个G,一个L,找出两个数a,b(a<=b),使得这两个数的最大公约数为G,最小公倍数为L,且(a最小). 分析: 当a,b存在时,a一定为G. 自己证了一下,数 ...
- Going Home - poj 2195(最小费用流 | 二分匹配)
题目大意:在一个网格里面有n个小男人和n个房子,现在想让每个小男人都有一个房子住,不过每个人移动一下都需要花费¥1,现在求出来最小的总花费.ps:可以认为网格的每个点都是很大的广场并且容纳所有的人,人 ...
- ubuntu14.04 制作U盘启动文件
1.制作U盘启动文件 网上搜索:U盘安装Ubuntu 12.10 图文教程(ultraiso) http://www.jb51.net/os/94398.html 2. 重启,按Del(或F2)进BI ...
- CloudFoundry Service 使用
Mysql服务在V2版本号中github上有独立的releaseproject(cf-mysql-release),该release提供了一个Mysql-broker和一个Mysql-server和( ...
