cocos2d-x 3d 粒子特效 抢鲜体验

码农们,福利来啦~~,加QQ即可抢鲜体验cocos2d-x最新整合的PU粒子特效功能,马上行动吧!! QQ号:14937464 请注明您的姓名+公司名,然后跟我说 我要~我要~我要~~, 我就会给你(整合后仓库的地址):15: ,接下来简单介绍一下目前整合的PU粒子特效的情况。

简介
Cocos2d-x目前通过extension的方式支持3D粒子系统,目前主要支持Particle Universe(下文介绍)构建的粒子系统,可通过解析脚本的方式直接读取粒子系统文件并渲染,快速高效。
Particle Universe是一款免费开源(插件开源)的3D粒子系统编辑器,它包括粒子编辑器和粒子插件,该系统本是专门为OGRE引擎(一款开源的3D引擎,多用于PC端)打造的,为OGRE提供一套完整的粒子系统解决方案,知名的PC游戏火炬之光(Torchlight)就是采用该粒子系统进行特效的构建,可见该粒子系统的强大。也正是由于该系统在粒子特效方面的强大功能,cocos2D-x先尝试在extension中支持该粒子系统,目前已经完成了对该系统基本功能的支持(支持列表见附录),往后会逐步支持其他高级功能,最终会全部支持整套粒子系统。关于Particle Universe的详细介绍及用法请参见官网(http://www.fxpression.com/)。
Cocos2d-x的Particle3D实现了Particle Universe的粒子插件,由于Particle Universe最初的设计是支持OGRE引擎,所以很多设计理念和OGRE的非常相似。而Cocos2d-x为了考虑到以后与其他粒子系统集成的扩展性,所以并未完全采用Particle Universe的设计方式,比如最大的区别就是Particle Universe把粒子系统分为了System和Technique,一个System可以由多个Technique来组成,每一个Technique都是一个可以完整执行的粒子系统。这样的设计理念多半来自于OGRE,而Cocos2d-x的PUParticleSystem3D类的设计则采用了Composite设计模式,用以解决上述一个System中有多个Technique的情况,所以PUParticleSystem3D类既有System的属性又有Technique的属性,所以在使用的过程中一定要注意,不要把PUParticleSystem3D类仅当做Particle Universe的System或Technique看待。除此之外Cocos2d-x的实现和Particle Universe的粒子插件大部分相同。

Particle3D用法
一般的粒子系统分为发射器,影响器和渲染器,发射器负责发射粒子,影响器作用于这发射出的一系列粒子属性,而渲染器只负责渲染。Particle Universe也不例外。
并且Cocos2d-x中创建并使用Particle3D有两种方式:
第一种方法直接通过create()方法创建一个PUParticleSystem3D,通过此方法创建的PUParticleSystem3D为空粒子系统,可以通过Code中手动创建Renderer、Emitter、Affector并与System关联,此方法适用于快速创建简单的粒子系统。由于PUParticleSystem3D派生自Node节点,构建完成后就可作为普通的Node节点处理,包括Action响应等等。用例如下所示:

auto ps = PUParticleSystem3D::create();
BlendFunc blend;
blend.src = GL_ONE;
blend.dst = GL_ONE;
ps->setBlendFunc(blend);
ps->setParticleQuota(2500);
ps->setKeepLocal(false);

//emitter
{
auto psse = PUParticle3DSphereSurfaceEmitter::create();
psse ->setRadius(12.0f);
ps->addEmitter(psse);
}

//affector
{
auto pca = PUParticle3DColorAffector::create();
pca->addColor(0.0f, Vec4(0.0f, 0.0f, 0.2f, 1.0f));
pca->addColor(0.9f, Vec4(0.8f, 0.8f, 1.0f, 1.0f));
pca->addColor(1.0f, Vec4(1.0f, 1.0f, 1.0f, 1.0f));
ps->addAffector(pca);
}

//render
{
auto pr = PUParticle3DQuadRender::create(“pump_flare_04.png”);
ps->setRender(pr);
}
ps->startParticle();
this->addChild(ps);

第二种方法同样使用create方法,只不过需要传入参数,传参的create有两个重载版本,如下所示:

static PUParticleSystem3D* create(const std::string &filePath);
static PUParticleSystem3D* create(const std::string &filePath, const std::string &materialPath);

第一个create方法接受一个粒子Script文件路径(绝对路径或者在FileUtil中指定搜索目录后传入相对路径),它会自动搜索Script文件上一层目录下的materials(名称固定)文件夹,并自动载入该文件夹下所有的material文件。
第二个create方法需要接受一个粒子Script文件路径和Material路径,它只会加载指定的Material文件,所以该create方法需要保证粒子Script中所用的Material定义在所传入的Material文件中,否则,只能使用默认的材质信息。在Material文件明确的情况下,强烈推荐使用该方法,这样能极大的缩短预加载时间,并且保证最小的内存消耗(因为解析的script会进行缓存)。用例如下所示:

auto rootps = PUParticleSystem3D::create(“electricBeamSystem.pu”);
rootps->startParticle();
this->addChild(rootps);
auto rootps = PUParticleSystem3D::create(“lineStreak.pu”, “pu_mediapack_01.material”);
rootps->startParticle();
this->addChild(rootps);

注:关于粒子的详细用法请参看cpp-tests中的Particle3D用例。

附录
Particle3D运行时截图,下图为在Particle Universe中的运行效果,下图为Cocos2d-x中的运行效果:

注:由于PC端和移动端OPENGL的实现有出入,部分特效效果不一定完全一致。

目前Cocos2d-x对Particle Universe支持情况(支持,不支持)

Renderer(粒子如何渲染):

Billboard Renderer

Box Renderer
Sphere Renderer
Entity Renderer
Ribbon Trail Renderer
Light Renderer

Emitter(粒子如何发射):

Point Emitter

Box Emitter
Sphere Surface Emitter
Vertex Emitter
Line Emitter
Circle Emitter
Mesh Surface Emitter
Position Emitter
Slave Emitter

Affector(粒子如何受影响):

Gravity Affector

Linear Force Affector
Scale Affector
Sine Force Affector
Colour Affector
Randomiser
Line Affector
Align Affector
Jet Affector
Vortex Affector
Geometry Rotator
Texture Rotator
Texture Animator
Particle Follower
Sphere Collider
Plane Collider
Box Collider
Path Follower
Inter Particle Collider
Collision Avoidance Affector
Flock Centering Affector
Velocity Matching Affector

Observer(对粒子的状态进行监听并反馈):

On Count Observer

On Emission Observer
On Expire Observer
On Position Observer
On Clear Observer
On Time Observer
On Quota Observer
On Velocity Observer
On Collision Observer
On Event Flag Observer
On Random Observer

Event Handler(反馈粒子系统):

Do Enable Component Event Handler

Do Expire Event Handler
Do Placement Particle Event Handler
Do Stop System Event Handler
Do Affector Event Handler
Do Freeze Event Handler
Do Scale Event Handler

Behaviour(控制粒子行为):

Slave Behaviour

Extern(扩展支持):

Gravity Extern

Sphere Collider Extern
Box Collider Extern
Vortex Extern
PhysX Extern
Scene Decorator Extern

前排支持。这个太炫了~

:14:求份 工具 使用 教程 。。

酷炫!:7::7::7:

酷炫!:2::2::2::2:

On Position Observer

Do Freeze Event Handler
3.5版本都已经支持了吧。这边要不要也同步更新一下支持的情况呢?

另外请教版主几个问题(使用的版本都是3.5正式版)
1.当我设置 On Position Observer 的y坐标小于 0 的时候,冻结粒子。 这里的y坐标是指的世界坐标吗?
因为我测试的时候把 粒子特效加在(0,0)点的时候 正常冻结。但是把这个特效加到(0,5)点的时候 粒子是移动到世界坐标的(0,0)点才会冻结。而我希望粒子是移动到,这个粒子特效的本地(0,0)点( 也就是 相对于世界坐标的(0,5)点 )就冻结。
不知道是cocos实现的有bug呢?还是这里的y坐标就是指的世界坐标呢? 如果我想让粒子到这个粒子特效的本地(0,0)点的时候冻结,该怎么样做?
2. 怎么样使用 3d 射线,计算屏幕上的touch 点 与3d 平面的交点呢?搜索到之前版主回答别人的问题,提到3d射线可以解决。但是苦于3d新手,找不到cocos在这方面的知识(其实是看不懂),版主能不能稍微详细解释一下。最好有例子什么的。方便理解。

Mark一下了