JCHub

  • Home
  • Category
    • A/V
    • WebRTC
    • Beauty of Programming
    • Linux
    • Windows
    • Moments of Life
    • Campus Life
  • Reference
    • API Reference
    • Utilities
    • AV Test
    • Doc
  • Message Board
  • About
JCHub
Code as My Sword, Lost in Obsession
Beauty of Programming

Ogre中的粒子系统(Particle System)

在3D应用中,大多数特效都要依靠粒子系统实现。虽然我们不一定需要粒子系统实现特殊视觉效果,但是需要特殊效果时,粒子系统能让我们的需求更容易实现。 粒子系统基础 粒子系统基于脚本实现,不支持硬编码,这是为了更快地实现原型与复用。如果需要的话,我们完全能通过编写代码创造与配置出粒子系统。粒子系统通常作为模板在particle脚本中定义,能够用在应用中,从而创建出粒子系统的多种实例。 粒子系统与3D场景 因为粒子系统能够附于场景节点上,所以也能像节点一样进行变换。缩放,旋转能够影响粒子系统的发射方向。更进一步说,粒子一旦发射,就将发射到世界空间中。这意味着,场景节点移动将带动发射器移动,但是发射的粒子仍然在后面。如果需要粒子与场景节点一起移动调整,可以设置粒子系统发射粒子到本地空间中,这会携带着发射的粒子与场景节点一起移动。 粒子系统发射粒子数量有限制。一旦发射的粒子达到数量限制,粒子系统将不能发射更多,直到发射的粒子消失。默认发射粒子限额是10,不过我们可以设置更多。 粒子系统边界 粒子系统动态特性表示他们的边界盒能够按规律重新计算。在每一帧中这样做虽然消耗很多,但是Ogre默认这样做,并且Ogre每10秒会停止更新边界一次。我们能够重写该行为,用ParticleSystem::setBoundsAutoUpdated()方法让Ogre在多少秒后更新边界,该方法传入stopIn参数,告诉Ogre在给定的事件后更新边界,如果写了一个粒子系统,必须知道不能让粒子系统边界超过一定大小,使用ParticleSystem::setBounds()方法设置边界盒大小,显而易见的说,这是设置边界最有效方法。如果我们事前知道粒子系统创建的界限,也只能这样做。这里给出一种妥协方案,ParticleSystem::setBounds()与ParticleSystem::setBoundsAutoUpdated一起工作,这样可以设置出事界限大小,并且在粒子系统创建后慢慢更新。 粒子系统的更新 当一个例子系统不在可视区域内时,还会持续更新,有可能等下重新进入视觉区域。这一点很重要,如果粒子系统一离开可视区域就停止了,几秒后重新回到可视区域时保持与离开时相同的状态,这会让视觉效果不和谐。 然而考虑到性能原因,当粒子系统离开视觉区域一段预设的时间周期后,会停止更新。考虑到暂时停止的粒子系统突然进入可视区域时,会造成前面提到的问题,为了解决该问题,Ogre提供了“fast-forward” 机制,允许粒子系统在解冻后(恢复更新)提前到达“目前”状态。该特性通过ParticleSystem::fastForward()方法提前创建粒子系统时间轴使用。 粒子系统排序 我们能够按照粒子与相机的距离排序粒子。该特性默认禁用。显而易见,按照与相机的距离排序每个粒子会对性能造成影响,特别是较大的粒子系统,但有时候没有其他方法实现该特殊效果。 比如下面一张图 该粒子效果禁用排序后效果如下: 下面一张图是使用了排序的粒子系统效果: 从两图的对比可以看出,没有排序的那张图中,粒子系统底部的火焰清晰而且不自然的透过烟雾,做了排序的那张图中,烟雾隐藏了火焰,这时候性能上做些损耗是值得的。 发射器 粒子系统发射器就是发射粒子的东西。Ogre提供的发射器默认以直观空间的形式发射粒子:点发射器从单点发射粒子到空间中,盒发射器从定义好的长方体任意方向发射粒子,圆筒发射器从照定义好的圆柱体以任意方向发射粒子,椭球发射器按椭球体发射粒子,然而空心椭球体发射器从椭球体的壳发射粒子,圆环发射器从平面环的边缘发射粒子。 粒子系统发射粒子的比例,速率与方向完全可配置。粒子系统附于场景节点上,因此发射器也拥有相对父节点的位置。 粒子并不按直线发射,通常发射到环绕发射器方向的圆锥体中,通过角度参数可以定义发射器。如果我们想按直线发射粒子,该参数设置为0即可。如果想以任意方向发射,该参数设置为180,设置为90时以环绕方向向量发射到半球中。 发射粒子的速率按每秒多少粒子定义。粒子能够以设定的速率发射,或者在规定范围内以随机速率发射。同样,发射的粒子有自己的生命周期(time-to-live,TTL,以秒为单位),或者让发射器为每个粒子从生命周期范围随机随机选取。粒子发射持续时间既可以设定,也可以在某个范围内随机选取。发射期间,粒子颜色可以设置为常量或者变化的值。 我们可以在运行库中加入定制的发射器,这可能是扩展Ogre粒子系统最简单的方法。 影响器 一旦粒子发射到世界中,影响器影响着粒子运动路径与存在时间。例如,我们能够对粒子施加重力,施加风力等。 线性力 线性力对系统中的日子施加力的作用。既然力是矢量,那么就有方向与大小。大小是按矢量定义的力的大小,因此force_vector 0 50 0与force_vector 0 100 0有同样的方向,但大小是后者的一半。由于不做检查的力能够导致巨大的速度,所以能用force_application设置力如何应用。force_application average通过设置平均力的速率与粒子大量速率使粒子速率渐渐趋于稳定。force_application add允许速率一直增加(或减少)。 颜色衰减器 颜色衰减器修改存在粒子的颜色。颜色定义决定于每秒组成成分的改变。如下代码每半秒衰减一次色彩: [crayon-69f0034550d61117707171/] 特别注意下这不意味着无限衰减,例子中的0.5表示色彩组成成分每秒钟强度减少0.5,因此开始时是白色色彩的话,两秒后将会衰减为黑色。 缩放器 缩放器设置统一的比例因素应用到粒子大小,比例因素均衡的应用到粒子大小。 旋转器 旋转其既可以按随机或确定的速度旋转粒子材质,默认值为0,表示没有旋转。 色彩图 通过色彩图像我们能够改变色彩,而不是按照定义的衰减因素。图像可以是.png, .gif, .jpg等格式。唯一的的参数是图像文件名称。 粒子系统使用 Ogre SDK中media/particle/smoke.particle包含了一个烟火效果的粒子脚本,如下所示: [crayon-69f0034550d6e991244465/] 材质文件在media/materials/scripts下的smoke.material,材质脚本如下: [crayon-69f0034550d73747069986/] 通过如下方法即可以使用上面的脚本创建一个烟火效果的粒子系统: [crayon-69f0034550d76477233703/] 也可以通过下面的代码创建: [crayon-69f0034550d79937297743/] 手动编写粒子效果脚本比较麻烦,我们可以利用别人开发的编辑器编辑粒子, 编辑器下载地址:http://pan.baidu.com/s/1sjnotat

2014年4月11日 0comments 2754hotness 7likes Jeff Read all
Beauty of Programming

Ogre中简单的AABB碰撞检测

AABB(Axis Aligned Bounding Box)即轴向包围盒,每个物体都有一个包围盒,该包围盒完全罩住了物体,可利用该包围盒近似模拟物体形状,实现碰撞检测,如下图所示,可使用类似 [crayon-69f0034552248721213404/] 的方法取得场景中某个物体,让物体绑定的场景节点的包围盒显示出来 当该物体的包围盒与其他要检测的物体的包围盒发生接触时,即表示发生了碰撞,由于包围盒不能完全模拟物体形状,所以该方法精度有限,只能适用于形状规则的简单物体,Ogre::AxisAlignedBoxSceneQuery 类封装了许多包围盒碰撞检测的方法,可利用该场景查询实现简单的碰撞检测,对于不需要应用该碰撞检测方法的物体,我们可以使用setQueryFlags()方法设置查询标识,场景查询使用setQueryMask()方法实现要与哪些标识的物体做碰撞检测。查询标识是一个很好用的东西,对于一些不需要做碰撞检测的物体,就可以通过设置查询标识过滤掉.下面是一个实现AABB场景查询的类,可以应用到自己程序中,实现一个简单的AABB碰撞检测。 CollisionAabb.h [crayon-69f0034552251542779611/] CollisionAabb.cpp [crayon-69f0034552256890798516/]

2014年4月7日 3comments 1811hotness 0likes Jeff Read all
Beauty of Programming

Ogre中移植Sample_Character到Advanced Ogre Framework

刚开始学习Ogre的时候,用的是BaseApplication这个框架,但是该框架不能满足更大规模的开发需求,比如不能进行游戏场景切换,游戏状态切换,后来我用了Advanced Ogre Framework,这是一个很不错的游戏框架,总共包含17个文件, 使用起来不是太难,可以看下官网上的介绍http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Advanced+Ogre+Framework Ogre SKD中Sample_Character那个sinbad挺好玩的,花了点时间把它移植到到了Advanced Ogre Framework,可以很容易利用这开发一个小游戏或者虚拟人物漫游系统,至于场景的话可以在3dsmax中构建,然后利用Ogremax插件导出为场景文件,在createscene方法中加入下面三行代码即可导入场景 [crayon-69f0034553484375455809/] 我在Advanced Ogre Framework新增加的四个文件代码如下,加入的这四个文件实现了可操纵的sinbad: SinbadCharacterController.hpp [crayon-69f003455348d249386089/] SinbadCharacterController.cpp [crayon-69f0034553491703394765/] 上面两个文件主要负责sinbad这个角色的创建 SinbadState.hpp [crayon-69f0034553497308258510/] SinbadState.cpp [crayon-69f003455349b894936206/] 上面两个文件创建了一个state,除了加入的这是个文件以外,还需要在MenuState.cpp,PauseState.cpp中各创建一个按钮,Demo.cpp中加入一个状态,具体的可以看下我分享的代码,代码下载地址: [Downlink href="http://jchblog.u.qiniudn.com/201404/AdvancedOgreFramework-test.zip"]加入了可控制sinbad的Advanced Ogre Framework[/Downlink] 程序运行部分截图: 菜单界面 Sinbadstate界面

2014年4月5日 5comments 2472hotness 0likes Jeff Read all
Beauty of Programming

Ogre中精确到三角面的碰撞检测(使用射线查询)

Ogre中的射线查询一般只能侦测到边界盒(AABB),就像你在下面图片看到的,使用下面的代码就能避免这些。 初始化射线查询: [crayon-69f0034554878556423406/] 射线投射: [crayon-69f0034554881420368621/] 得到网格信息: [crayon-69f0034554885064044352/] 如果要考虑对处于运动状态物体做碰撞检测,可使用如下的得到网格信息代码(如果运动物体使用硬件蒙皮下面代码会出问题): [crayon-69f003455488a284956482/] 总的原理是进行射线查询,然后获取模型mesh顶点与索引信息,将每三个顶点构成一个三角面,将定义好的射线与这些三角面进行相交,得到距离最近的交点,射线发射点与该交点距离即为最近距离,最后返回该最近距离。 具体代码使用大家可以参考MOC这个轻量级的碰撞检测库,官网上有示例,可以很容易的掌握。

2014年4月4日 0comments 2140hotness 0likes Jeff Read all
Campus Life

这一周

这一周依旧很忙碌,每天坐在电脑前做毕设,不断查看国外文档,逛Ogre论坛,学习知识。不过收获还是蛮大的,上个月30号把碰撞检测实现了,包括地面以及周围物体的碰撞检测,虚拟人物已经可以在自己建模的世界中漫游,不过还有很大的优化空间,今天给学长看了原型系统,学长说还OK,把模型建好看点就差不多了。我后面要做的事就是优化与写论文了。毕设是从2月底回校时开始搞得,到现在差不多一个月多一点,这一个月来学到了很多,把3DSmax都学会了,顺便要感谢下谷歌,Ogre所有资料都是国外的,我搜索的问题都是在国外网站找到答案,国内的大多都是复制来复制去的,有的错误一大堆也敢往上放,原创的东西太少了。 周一时候寝室停电了,我们四个去卡拉OK唱了一下午,每个人疯狂吼着,虽然都很难听,不过都不介意,要的就是这种感觉,释放压力。 离毕业就剩两个多月了,剩下的时光继续努力吧!

2014年4月3日 0comments 1263hotness 0likes Jeff Read all
Information Technology

VR(虚拟现实)正在改变什么

虚拟现实(Virtual Reality,简称VR),这一词汇由来已久,但感觉与我们的生活不太相关。不过随着计算机图形学与可穿戴智能设备发展,虚拟现实应用将会越来越多,逐渐走进我们的生活。在不久前的GDC上,随着Oculus Rift二代的亮相以及索尼公开的Project Morpheus,让我们感受到,这“遥远”的技术也许很快就会来到我们身边,成为给生活增添趣味的添加剂。 第二代的Oculus Rift硬件规格不输给索尼的Project Morpheus,两者都拥有1920×1080P(双眼)分辨率显示,采用内置陀螺仪和加速计,可用于检测用户头部的转动,同时还需配合外部摄像头来判断用户头部位置。不过,最大的不同就是,开发者如今可以在Oculus网站上预订Oculus Rift V2套件(包括开发工具集),并将在7月份出货,而索尼的Project Morpheus,预计今年是看不到了。 对于虚拟现实,我们最常见的是在电影中看到的场景,而且潜意识里认为,这只不过是针对土豪设计出的玩意,不过当得知Oculus Rift V2套件的预订售价为350美元时,总算感觉到,高新科技终于开始放下身段,走上“平民路线”了。其实虚拟现实技术并不是只在游戏领域风生水起,其技术同样广泛地应用于军事、医学、建筑、工业仿真、考古、文化教育、农业和计算机技术等方面,改变传统的人机交互模式。 VR技术在军事上的应用就是可以进行作战模拟,而其中主要的人机接口设备就是采用VR技术和高清显示器构成的VR头盔显示器(简称HMD),对于提高军队训练质量、节省训练经费以及研制新型武器系统等等都有着极其重要的作用;医学上则是采用在虚拟环境中,建立虚拟的人体模型,借助于跟踪球、HMD、感应手套,学生可以很容易了解人体内部各器官结构,这比现有的采用教科书的方式要有效得多;建筑上实施视觉模拟,工业仿真上对模型进行各种动态性能分析……总之,VR技术带给我们的不仅仅是游戏娱乐,更多的是实际上的应用。也许正如Oculus Rift开发者所说的那样,虚拟现实将会改变世界。

2014年3月26日 0comments 1165hotness 0likes Jeff Read all
Audio & Video Sharing

不愿相信的事实

刚才新闻上说:马总理宣布马航MH370航班坠毁于南印度洋,无人幸存。这半个月来一直关注失联客机的消息,期间多么希望是被劫机,可结果却是这样冰冷的事实。 我不愿相信这个事实,残骸都还没找到,为何就根据数据判定飞机坠毁在南印度洋,还无人幸存,如此做决定是不是背后隐藏着什么。对生命需要一个好的交代,这半个月来马来西亚方面不断地否认,极不负责任,感觉马来西亚方面一开始知道怎么回事,却让大家满大海找,今天不知什么原因说出来了。真不把我们当回事,要是客机上都是美国乘客,他们还这么叼。 随着时间不断推进,希望真相早点解开,生命需要交代,我们渴望真相,真相是对生命最好的交待!

2014年3月24日 0comments 13hotness 0likes Jeff Read all
Beauty of Programming

Ogre学习笔记(4)

这篇文章主要是自己对一些Ogre容易错的知识点的总结,会不断补充更新: (1)ogre中,坐标变换是相对于parent节点的,比如节点node1 Position(10,0,0),node1创建一个子节点node2,我们打算设置位置为(10,10,20),由于坐标变换是相对的,所以node2需要setPosition(0,10,20) (2)相机的clipdistance要设置好,比如前面遇到的看不到天空 (3)我的场景中,所有物体是通过场景文件.scene导入的,要得到场景中所有Entity,给所有物体设置标识可通过如下方法: [crayon-69f00345551cf551833530/] (4)使用粒子系统要记得载入Plugin_ParticleFX.dll插件,在plugins.cfg中要添加该插件路径,如果不添加插件,运行时程序会抛出异常:Cannot find requested emitter type

2014年3月15日 0comments 1271hotness 0likes Jeff Read all
1…1516171819…26
Copyright Statement

Unauthorized reproduction or plagiarism in any form is strictly prohibited. For reprint requests, please contact via email.

Recent Comments
Miles0u Published at 5 days ago(04 04202643009 22 22pm26) The clock is ticking. The next 1M jackpot won’t ...
Addiea9 Published at 3 weeks ago(04 04202643001 08 08am26) Some called it luck. Then Sarah cashed 800K. Be ne...
snail Published at 1 months ago(03 03202633105 27 27pm26) 多谢,大佬。醍醐灌顶!
dongxuh Published at 9 months ago(07 07202573103 27 27pm25) 真心不错的博客,有机会能一起分享
南南 Published at 10 months ago(07 07202573103 15 15pm25) 写的超棒!
Ad

COPYRIGHT © 2026 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang