首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >粒子系统设计?

粒子系统设计?
EN

Stack Overflow用户
提问于 2009-09-23 12:37:29
回答 4查看 4.7K关注 0票数 11

我正在设计我自己的粒子系统引擎,这是为了学习,我真的不想使用现有的引擎。

现在,我产生了美丽的粒子,但我想布局引擎,使其更容易与他们一起工作。

我一直在想一个“粒子系统”,

该类将包含以下引用:

particlesList:组成系统的粒子的列表。

systemEmitter:系统发射器对于粒子,发射器类应该能够执行几种粒子发射技术,例如,从线发射,点发射,从多边形随机发射。另外,这个类应该进行排放控制,就像向一个点发射一样,远离一个点,在一个方向和时间内发射。

例如,particleController:管理围绕点的旋转、可变的粒子大小、可变的粒子颜色、粒子以不同方式反应的系统周围的区域、碰撞检测(与其他对象或在粒子内部的碰撞检测(如果成为必要的话) )。

粒子渲染器:负责绘制本系统,可变混合类型,颗粒纹理,颗粒类型,如三角形,圆圈,定制。

这四个项目,组成粒子系统类。有些FX可能需要一个以上的粒子系统,例如一个fire,可以使用一个系统进行火灾,一个系统用于烟雾,一个系统用于火花。

这就是我心中的想法,但我真的很想知道这种设计方法是好的,还是你看到我遗漏了什么,或者可以/应该做一些不同的事情。我还没有想过用什么简单的方法来“保存”FX,比如告诉我的引擎什么才是最好的方法,“画火”、“画爆炸”、“画喷泉”等等,也许将FX信息存储在xml文件中是个好主意,等等。

我非常欢迎你的意见,正如我之前说过的,我真的想要建立这个,而不是使用另一个引擎,因为学习的原因。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-23 16:16:06

这套安排应该没问题。我希望你们正在考虑的是,数据将构成粒子类中的一个粒子。您只想拥有最基本的东西,所以在运行系统时只需要尽可能少地读写内存。

就数据驱动而言,这应该是非常直接的。我建议使用xml和二进制格式选项来加载。因此,您可以在开发过程中轻松地调整内容(并且没有工具)。一旦您有了工具或完成了调整,我就会将xml转换为二进制文件,以便快速加载。

您还可能需要一个管理类来处理这些粒子系统的创建和更新。这也将使您有机会处理与所有系统相关的其他功能。这方面的一些例子是限制由于性能原因而可以管理的粒子系统或粒子的数量,或者有一个所有系统都应该考虑的碰撞平面。

你提到这是为了教育的目的,在这方面,这些东西是相当挑剔(但重要的是,如果你要使用这个游戏是粒子重)。

我假设这是使用像DirectX或OpenGL这样的API来呈现。在这方面,我会让粒子效应为你的顶点信息共享相同的内存池。这大大提高了渲染速度。我也会跟踪受粒子系统影响的区域的边界,以便与果肉剔除一起使用(AABB或圆形)。

更新粒子系统的一个重要部分是属性如何从一个值传递到另一个值。你越能动态地插值值,你的效果就会越好。简单的线性插值可以足够好,但是最好有一个动态图来插值这些值。例如,与其在一秒钟内从0到255蓝色,不如在0.2秒内从0到128,然后在0.8秒内达到128-255。添加这将大大增加您的效果的选项。

此外,我认为你对你想做的事情有一个很好的想法。你提到的渲染不同类型的粒子告诉我,你正在用正确的方式思考这个问题。我见过人们制造粒子引擎,只是专注于渲染一个广告牌上的四边形。拥有发出三维几何的选项确实会让事情看起来很棒。您可能还想考虑(如果您还没有),您的系统有能力获取模型信息,并动态地将其分解为将被发射的粒子。实际上,爆炸模型比显示一些爆炸粒子或使物体褪色或切换到受损状态要好得多。

票数 5
EN

Stack Overflow用户

发布于 2009-09-29 20:43:15

只是一些简单的,2D精灵粒子优化的想法。

一个好主意是发送所有粒子在一个顶点数组/ VBO,并使用顶点着色器更新他们的位置随着时间的推移。如果你有一个简单的运动,可以很容易地用数学公式来描述,x(t)y(t) (也就是说,它们只依赖于时间),这是很好的。

另一个伟大的想法是使用点精灵而不是三角形和四边形。这将使管道上所需的带宽减少到四分之一。

在我的空间模拟中,我实现了最简单的方法:使用glBegin()/glEnd()作为纹理四边形发送的粒子。它们作为个别物体被倾倒到目前的“部门”,从倾倒之时起完全独立。这是要做的最原始、最愚蠢和最愚蠢的事情,并导致性能的大幅度下降,特别是因为我所做的是通过STL向量的迭代器遍历对象并依次发送每个对象。

你需要考虑你想要多少粒子,你想让它们做什么。*你想让他们对周围的环境做出反应并碰撞吗?然后,您需要更新处理的CPU和数据一遍又一遍。*它们只是以最愚蠢的方式飞行吗?然后,你可以通过发送所有粒子,如VBO和TBO,并更新他们在阴影。

玩得开心!

更新为与asker中的注释1相关:-)

我要做的是使用接吻原则。这意味着:一个名为ParticleEmitter的类包含一个顶点数组、一个速度数组和一个带有简单对撞机(如平面、球面、三角形)实例的STL vector。另外,还有一个带有对撞机的“全局”* STL vector。然后根据对撞机更新速度。

同样的情况也可以发生在影响者身上(重力、风等):ParticleEmitter中另一个带有影响者的STL载体和另一个“全局”STL vector带有爱好者。

关联器和对撞机将是实现affectParticle(particle_t*)的类。在哪里struct particle_t { float x,y,z; float vx,vy,vz; }。我会保持它的POD结构,并运行更新在ParticleEmitter::update()

但是,如果您在iPhone上运行这个程序,会不会过于复杂?也许你能摆脱你已经实现的东西?我不知道我的设计会如何影响基准测试的结果,但如果你把粒子、对撞机和仿射器的计数保持在低位,这听起来很合理,因为它听起来可能与n*c+n*a的比例差不多。

这些只是我的临时想法,以及我个人如何实现它。你的设计,或者其他人的设计,可能会更好:-)

*在引号下的“全局”,因为使用任何空间分区都可能是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2010-03-14 20:28:03

我在C++中为自己的引擎实现了同样好的设计。我没有使用引用和模板策略(策略-阅读Alexandresku的“现代C++设计”)。静态多态性提供了更好的性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1465716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档