爆炸3dmax粒子爆炸 生命期尺寸调节 为什么不管用

第七章 Unity3D粒子系统详解
核心提示:粒子系统属于游戏引擎的高级应用系统,它可以帮助开发人员制作和实现复杂的动画特效,游戏引擎的粒子系统是否强大,往往决定了这款引擎的成熟和完善度。Unity引擎公司在每一版引擎的研发中都会不遗余力的提升粒子...
1.粒子系统属于游戏引擎的高级应用系统,它可以帮助开发人员制作和实现复杂的动画特效,游戏引擎的粒子系统是否强大,往往决定了这款引擎的成熟和完善度。Unity引擎公司在每一版引擎的研发中都会不遗余力的提升粒子系统的功能和效果。从旧版的粒子系统到3.5的新粒子系统,再到4.x全新的Shuriken粒子系统。
2.Legacy Particles粒子组件
LegacyParticles是旧版遗留的粒子系统,我们可以在Component组件下的Effects进行创建,它包括五个组件,分别是EllipsoidParticles Emitter椭球粒子发射器、Mesh Particles Emitter网格粒子发射器、ParticlesAnimator粒子动画、Particles Collider粒子碰撞器和ParticlesRenderer粒子渲染器。旧版的只能将组件添加到游戏对象上,所以我们要添加粒子发射器、粒子动画和粒子渲染三个组件,如果想要粒子具有碰撞,在添加粒子碰撞器。
然后就是Ellipsoid ParticlesEmitter椭球粒子发射器参数的设置:Emit 启动粒子发射器的选项;Min Max Size粒子尺寸;Energy秒计算的生命周期;Emission 每秒的数量;World Local Velocity 全局和本地的速度;RndVelocity 随机速度;Tangent切线;Angular角度;Simulate In World Space勾选了,发射器动,粒子不动,不勾选,粒子随着发射器移动;One Shot一次发射;Ellipsoid 空间范围 椭球形的;MinEmitter Range 发射器范围;Emitter Velocity Scale =2该粒子发射时候将继承2倍发射器的变化。
ParticlesAnimator参数设置:Does Animate Color每个粒子在生命周期内按照颜色顺序产生色彩变化;ColorAnimation 变化颜色的选择;World Local Rotation Axis全局和本地旋转轴;Size Grow粒子尺寸增长;Rnd Force 随机的从小变大;Force 给粒子一个固定的施力方向;Damping 衰减;AutoDestruct 自动销毁;
World ParticleCollider参数设置:Bounce Factor弹力因子;Collision Energy Loss碰撞能力的损失;Collides with,没个层级的粒子会相互碰撞;Send Collision Message若启动,没个粒子向外发送一个碰撞消息,你可以通过脚本获得到;Min Kill Velocity粒子的速度降低到这个最小死亡速度,将因碰撞而被淘汰。
ParticlesRenderer参数设置:Cast Shadows 粒子是否产生阴影;Receive Shadows粒子是否接受投射的阴影;Materials 粒子的外观材质;Use Light Probes启用灯光探查器,用来制作光影贴图;Light Probes Anchor旋转灯光探测的锚点位置;Camera VelocityScale在场景中摄影机移动时调整此数值来拉伸粒子已达到在镜头中想看到的效果;StretchParticles粒子出现在摄像机中的渲染方式;Length Scale 决定了粒子被拉伸的长度;VelocityScale粒子拉伸的速度;Max Particles Size粒子显示的最大尺寸;UVAnimation让粒子产生UV动画效果。StretchParticles伸展粒子下拉菜单中一共有五项:Billboard表示粒子面对镜头时候呈现;Stretched是朝粒子运动的方向去做拉伸延展;SortedBillboard是当用混合材质时,粒子会依照距离镜头的远近做排列;VerticalBillboard为所有的粒子沿x和z轴对齐飘动;Horizontal Billboard让粒子沿x和y轴对齐飘动。
3.Particles System粒子系统
Unity3.5更新引入了全新的ParticlesSystem,新版的粒子系统优点:1可以在Hierarchy面板上附加任意的游戏对象,成为其自物体;2而且可以无限制添加多个粒子系统,旧版只能作为组件添加个游戏对象,而且只能有一个,不能重复。我们制作大型和复杂的粒子特效时,必须通过多个粒子发射器互相叠加和组合。点击GameObject-ParticlesSystem创建新的粒子系统,新的粒子系统是单个游戏对象形式出现的,我们可以再Inspector面板对其参数进行设置:
1Particles System初始化模块参数:
Duration持续时间;
Looping粒子系统是否循环;
Prewarm预热,当looping启动时,才能启动预热系统,这意味着,粒子系统在游戏开始时已经发射粒子,就好像它已经发射了粒子一个周期了;
StartDelay粒子系统发射粒子之前的延迟,注意在Prewarn启动下不能用此项;
StartLifetime以秒为单位,粒子的存活时间;
Start Speed粒子的发射速度;
Start Size粒子的大小;
StartRotation粒子发射时的旋转值;
Start Color粒子的颜色;
GravityModifier重量修改器;
InhertVelocity控制粒子速率的因素将继承自粒子系统的移动;
SimulationSpace粒子系统是自身坐标系还是世界坐标系;
Play OnAwake如果启动,粒子系统将被创建是就自动开始播放;
Max Particles最大的粒子数量;
2.在ParticleSystem初始化模块下面是一系列选项面板,每个面板都对应各种粒子的控制选项参数,下面一一讲解:
1.Emission发射模块,控制粒子的发射速率,可以在某个时间段发射大量的粒子,在模拟爆炸时非常有效。
Rate速率,每秒粒子的发射数量;
Bursts突发,在粒子系统生存期间突然爆发;
Time and Number of Particles粒子的时间和数量,指定时间发射指定数量的粒子 +-控制爆发数量;
2.Shape形状模块
Sphere球体,Radius半径;Emit from Shell从外壳发射;RandomDirection随机方向;
Hemispher半球;
Cone椎体,Angle角度;Radius;
Box立方体,BoxX、Y、Z立方体的三个轴;Random Direction随机方向;
Mesh网格,Type类型,粒子将从顶点、边或者面发射;Mesh,选择一个多面形作为发射面;RandomDirection随机发射;
3.Velocity OverLifttime存活期间的速度模块,控制粒子的直接动画速度,x、y、z用来控制粒子的运动方向,可以通过常量或曲线来控制;Space、World选择速度是根据局部的还是世界坐标系确定方向;
4.Limit Velocity OverLifetime存活期间的限制速度模块,可以控制粒子模拟拖动效果,如果有了确定的阈值,将抑制或者固定速率。SeparateAxis分离轴,用于每个坐标轴的控制;Speed速度,控制粒子所有方向轴的速度,用XYZ分别控制;Dampen阻尼,通过0-1的数值确定多少过度的速度将被减弱,例如0.5,将以50%速率降低速度。
5.Force OverLifetime存活期间的受力模块,XYZ三个轴向的受力;Space、World;Randomize。
6.Color Over Lifetime颜色模块,存活期间粒子的颜色。
7.Color by Speed颜色速度模块,可以使粒子颜色根据其速度产生动画效果。
8.Size Over Lifetime存活期间的尺寸。
9.Size by Speed尺寸速度模块。
10.Rotation Over Lifetime
11.Rotatino by Speed
12.Collision碰撞模块,为粒子系统建立物理碰撞,现在只支持平面碰撞
1.Planes平面,Planes被定义为指定变换引用。变换可以场景里面的任何一个,而且可以动画化。多个平面也可以被使用。注意Y轴作为平面的法线。
2.Dampen阻尼,当例子碰撞时,会受到阻力影响。设置0-1,当为1时,任何例子碰撞后将变慢。
3.Bounce弹力,当例子碰撞时,会受到弹力影响。
4.LifetimeLoss生命衰弱,每次碰撞都减少生命,当生命为0,粒子死亡。如果想让粒子在第一次碰撞就死亡,将这个值设置为1。
5.Min Kill Speed,最小的死亡速度,小于这个速度,粒子消亡。
6.Visualization可视化,可视化平面,可选择Grid网格,Solid实体,在场景渲染为平面,用于平面的精确定位。
7.Scale Plane缩放平面。
13.Sub Emitter次级粒子发射器,非常好用的模块,当粒子出生、死亡、碰撞时可用生成其他次级粒子。
14.Texture SheetAnimation纹理层动画模块,在粒子系统存活期间设置面片的UV动画。Tiles平铺,定义贴图纹理的平铺;Animation·动画,指定动画类型,可用选择整格或单行;Cycles周期,指定UV动画的循环速度。
15.Renderer渲染器模块
1.Render Mode渲染模式
1.Billboard广告牌,让粒子面向摄像机。
2.Stretched Billboard拉伸广告牌,粒子将通过下面属性伸缩:CameraScale摄像机缩放,决定摄像机的速度对粒子伸缩的影响程度;Speed Scale速度缩放,通过比较速度决定粒子的长度;LengthScale长度缩放,通过比较宽度来决定粒子的长度。
3.Horizontal Billboard水平广告牌,让粒子沿Y轴对齐。
4.Vertical Billboard垂直广告牌,当面向摄像机时,粒子沿XZ轴对齐。
5.Mesh网格,粒子渲染时使用网格模型。
2.Material材质,广告牌或网格粒子所用的材质。
3.Sort Mode 排序模型,粒子的渲染优先顺序。
4.SortingFudge排序校正,这个值将影响粒子的渲染顺序,值比较小,粒子可能被最后渲染,从而显示在透明物体或者其他粒子的前面。
5.Cast Shadows投射阴影,让粒子系统可以投射阴影。
6.Receive Shadow,让粒子接受其他物体的投影。
7.Max ParticlesSize最大粒子的尺寸。
3.火焰,密集型粒子。
4.落叶,分散型粒子。【求助】AE CC2015里面使用particular插件不能设置粒子生命颜色_ae吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:395,481贴子:
【求助】AE CC2015里面使用particular插件不能设置粒子生命颜色收藏
如图,我设置了生命期的颜色,但是粒子的颜色依旧是默认的彩虹色。我保存关掉再打开以后会变成我最后设置的颜色,是不是因为插件的BUG?有没有解决办法?
HKAE1.0型声发射在线ae,适用工件校直,压装,冲击过程中.ae灵敏度高,检查覆盖面积大,可以远距离监测,400-965-1118
改一下随机种子值试试
你居然有汉化的
你这个汉化的那个版本 Form插件也有BUG 不能实时更新效果 换最新的插件吧
英文吧那个生命期改为over life就可以了!!而中文汉化后我也不知道叫什么玩意儿了!!
mdyy   --来自助手版贴吧客户端
我也是这个问题 求助
已解决,更新到最新版本2.26
求个汉化补丁,或者把你的汉化好的aex上传下
你到最后怎么解决的呀
我现在也遇到和你一样的问题
时光教育,12年行业经验,精湛教学,独特实训模式,与ae0距离!快速掌握ae软件,轻松跨入影视制作门槛!为理想插上翅膀,月薪20K不是梦!
楼主求插件,我q:
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或用DirectX实现粒子系统(三) - zdd - 博客园
随笔 - 201, 文章 - 65, 评论 - 1695, 引用 - 0
上一篇讲了如何在DirectX中使用点精灵,这篇再扩展一下,讲讲如何实现一个完整的粒子系统效果-烟花。任何一种复杂的现象都可以拆分为若干独立的小单元,烟花也是如此,一个绚丽的烟花无非是若干小粒子按照一定的顺序,一定的速度,颜色及存活时间组合而成的。烟花的种类成千上万,不同的烟花有不同的效果,我们今天主要讲述爆炸效果。先来几张效果图吧,如下。
前面说了,一个复杂的现象是由若干个基本单元构成的,所以,我们最先定义这个基本单元-粒子,一个粒子主要有哪些属性呢?由上面的图可知,首先粒子是有颜色的,上面一共有白,红,黄,绿四种颜色的粒子。其次,粒子是有大小的,只有大小不同的粒子相互组合才能构成特殊的渐进效果。再次粒子也是有纹理的,比如上面的效果中,我们一共使用了如下三种纹理
粒子也是有位置的,给粒子设定一个初始位置,然后按照时间不断变化粒子的位置才能形成特殊的效果。粒子也是有生命周期的,因为随着时间的流逝,粒子会渐渐变暗,最终消亡,消亡的粒子将不再被渲染。运动的粒子还要有一个初始速度及加速度。就这些了!下面列出了一个粒子应该具备的所有属性。
所以,我们可以如下定义一个粒子类。
class Particle
Particle(void);
virtual ~Particle(void);
// Draw particle when isLive is true
float m_lifeT
// How long the particle will last
// These two values are only take effect when m_lifeTime=-1
float m_lifeTimeM
// Minimum life time
float m_lifeTimeM
// Maximum life time
// Time since the particle was born, if age & lifeTime, particle was dead
// Particle color
D3DXVECTOR3
// Current position
D3DXVECTOR3
// Current velocity
D3DXVECTOR3
// Initial velocity
有了粒子类,我们还需定义一个粒子系统类,粒子系统类的任务是操作粒子类,来完成粒子的生成,更新,渲染,消亡及再生成的过程,通过生成及更新粒子的状态来实现整个粒子系统的效果。这是一个抽象类,包含四个纯虚函数,Init函数用来初始化粒子系统,比如创建Vertex Buffer,载入粒子对应的纹理等。Update函数用来更新粒子系统的状态,也就是更新系统中每个粒子的状态,包括粒子的速度,位置,存活时间等,都由该函数来更新。Render函数用来渲染粒子系统,这是最关键的一个函数。AddParticle函数用来添加新的粒子到粒子系统中,因为每个粒子都是有生命周期的,超过生命周期的粒子则为死忙状态,为了节约资源,我们将死亡状态的粒子重新设置为新生粒子,然后修改其属性再加入到粒子系统中,这样就可以通过有限的粒子实现多个爆炸效果了。
#include "Particle.h"
class ParticleSystem
ParticleSystem(void);
virtual ~ParticleSystem(void);
virtual void Init() = 0 ;
virtual void Update(float timeDelta) = 0 ;
virtual void Render() = 0 ;
virtual void AddParticle() = 0 ;
virtual void ResetParticle(Particle* particle) = 0 ;
#endif // end PARTICLESYSTEM_H
然后,我们定义一个Emitter类来继承上面的抽象类,并实现其中每个纯虚函数。Emitter类来完成具体的粒子系统需要的工作。
先看构造函数,构造函数主要做一些初始化工作。
Emitter::Emitter(IDirect3DDevice9* pDevice, EmitterConfig* emitterConfig, ParticleConfig* particleConfig)
:m_particleTexture(NULL), pVB(NULL)
vbOffset = 0 ;
// vertex buffer offset
vbBatchSize = 50 ;
// number of particles to render every time
device = pD
// D3D device
m_position = emitterConfig-&P
m_numparticlestoadd = emitterConfig-&NumParticlestoA
m_maxNumParticles = emitterConfig-&MaxNumP
vbSize = m_maxNumP
// Vertex buffer size
// Particle attributes
m_particleColor = particleConfig-&C
m_particleTexName = particleConfig-&TextureN
m_particleLifeTime = particleConfig-&LifeT
然后是Init函数,在这个函数里,我们创建Vertex Buffer,并从文件创建粒子纹理。
void Emitter::Init()
// Create vertex buffer
device-&CreateVertexBuffer(
vbSize * sizeof(POINTVERTEX),
D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS | D3DUSAGE_WRITEONLY,
D3DFVF_POINTVERTEX,
D3DPOOL_DEFAULT, // D3DPOOL_MANAGED can't be used with D3DUSAGE_DYNAMIC
std::string resourcePath = "../Media/" ;
resourcePath += m_particleTexN
// Create texture
D3DXCreateTextureFromFile(device, resourcePath.c_str(), &m_particleTexture) ;
接下来是Update函数,注意这个函数每一帧都会调用一次,而且先于Render函数调用,所以整个粒子系统在渲染之前是通过该函数对每个粒子进行初始状态设置的。在这个函数中,我们对容器vector&Particle&中的每个粒子都进行状态更新。首先判断粒子是否存活,如果存活则更新状态,否则通过调用ResetParticle函数重置粒子状态为存活,并再次将其加入粒子系统,这样可以避免生成新的粒子,在性能上可以获得优势。更新粒子的状态包括更新位置,更新粒子时间及颜色,如果粒子的存活时间超过其生命周期则将其置为死亡状态。第二个for语句用来生成新的粒子,因为刚开始,整个粒子系统中并没有粒子存在,所以容器vector&Particle&为空,这意味着第一个for语句在粒子系统刚刚运行时是不会执行的。需要通过第二个for语句向系统中增加新的粒子。直到填满整个容器。随后的循环渲染才会调用第一个for语句。
void Emitter::Update(float timeDelta)
for (std::vector&Particle&::iterator citor = buffer.begin(); citor != buffer.end(); ++citor)
if (citor-&m_isLive) // Only update live particles
citor-&m_position += timeDelta * citor-&m_velocity * 10.0f;
citor-&m_age += timeD
citor-&m_Color = this-&m_particleC
if (citor-&m_age & citor-&m_lifeTime)
citor-&m_isLive = false ;
ResetParticle((Particle*)(&(*citor))) ;
// Emit new particle
for (int i = 0 ; i & m_numparticlestoadd && buffer.size() & vbS ++i)
ResetParticle(&particle) ;
buffer.push_back(particle) ;
再下来就是ResetParticle函数,这个函数用来重置一个死亡粒子的状态,使其再次进入粒子系统,这样要比重新生成一个粒子节省时间。首先将粒子状态置为存活,然后将其已存活时间设置为0,然后是设置粒子的生命周期,这里可以从配置文件读取值,也可以通过函数随机生成一个值,这样的话每个粒子的生命周期都是随机的,会产生不同的效果。否则的话,所有粒子同时生成,同时消亡,则略显生硬。接下来设置粒子的位置和颜色,最后设置粒子的速度,这里的速度和物理学中的速度一样,是个矢量,我们选取范围为[-1,-1,-1]到[1,1,1]内的矢量,这样产生的所有速度将构成一个半径为1的球体。和烟花的效果比较类似。
void Emitter::ResetParticle(Particle* particle)
particle-&m_isLive = true ;
particle-&m_age = 0.0f ;
if (m_particleLifeTime != -1)
particle-&m_lifeTime = m_particleLifeT
particle-&m_lifeTime = Utilities::GetRandomFloat(0, 1) ;
particle-&m_position = m_
particle-&m_Color = m_particleC
D3DXVECTOR3 min = D3DXVECTOR3(-1.0f, -1.0f, -1.0f);
D3DXVECTOR3 max = D3DXVECTOR3( 1.0f,
Utilities::GetRandomVector(&particle-&m_velocity, &min, &max);
// normalize to make spherical
D3DXVec3Normalize(&particle-&m_velocity, &particle-&m_velocity);
接下来是AddParticle函数,该函数首先生成并重置一个粒子,然后将该粒子添加到粒子系统中。
void Emitter::AddParticle()
ResetParticle(&particle) ;
buffer.push_back(particle) ;
最后,也是最重要的,Render函数,用来完成最终的粒子系统渲染工作。在这个函数里,我们首先设置一系列的RenderState,这些RenderState都是用来设置粒子的渲染状态,这里就不一一详述了,接下来设置纹理,也不必多说。最后是真正绘制粒子的代码,在绘制的时候,我们采用分批处理的办法,每次绘制一部分粒子,这里我们设置了一个vbBatchSize值,这就是每次绘制的粒子个数,我们会在Vertex Buffer中一次性锁住这么多粒子,然后绘制,绘制完毕移动到下一批,继续绘制,直到剩下的粒子数小于vbBatchSize,最后再把所有剩下的粒子一次性绘制完毕即可。
void Emitter::Render()
// Set render state
device-&SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
device-&SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
device-&SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
device-&SetRenderState( D3DRS_POINTSPRITEENABLE, TRUE) ;
device-&SetRenderState( D3DRS_POINTSCALEENABLE, TRUE) ;
device-&SetRenderState( D3DRS_POINTSIZE,
Utilities::FloatToDword(0.5f) );
device-&SetRenderState( D3DRS_POINTSIZE_MIN, Utilities::FloatToDword(0.00f) );
device-&SetRenderState( D3DRS_POINTSCALE_A,
Utilities::FloatToDword(0.00f) );
device-&SetRenderState( D3DRS_POINTSCALE_B,
Utilities::FloatToDword(0.00f) );
device-&SetRenderState( D3DRS_POINTSCALE_C,
Utilities::FloatToDword(1.00f) );
// Set texture
device-&SetTexture(0, m_particleTexture) ;
device-&SetStreamSource( 0, pVB, 0, sizeof(POINTVERTEX));
device-&SetFVF(D3DFVF_POINTVERTEX) ;
// Start at beginning if we reach the end of vb
if(vbOffset &= vbSize)
vbOffset = 0 ;
POINTVERTEX*
pVB-&Lock(
vbOffset * sizeof(POINTVERTEX),
vbBatchSize * sizeof(POINTVERTEX),
(void**)&v,
vbOffset ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD
DWORD numParticleinBatch = 0 ;
for (std::vector&Particle&::iterator citor = buffer.begin(); citor != buffer.end(); ++citor)
if (citor-&m_isLive) // Only draw live particles
v-&pos = citor-&m_
v-&color = citor-&m_C
numParticleinBatch++ ;
if (numParticleinBatch == vbBatchSize)
pVB-&Unlock() ;
device-&DrawPrimitive( D3DPT_POINTLIST, vbOffset, vbBatchSize) ;
vbOffset += vbBatchS
if (vbOffset &= vbSize)
vbOffset = 0 ;
pVB-&Lock(
vbOffset * sizeof(POINTVERTEX),
vbBatchSize * sizeof(POINTVERTEX),
(void**)&v,
vbOffset ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD
numParticleinBatch = 0 ;
pVB-&Unlock() ;
// Render the left particles
if (numParticleinBatch)
device-&DrawPrimitive(
D3DPT_POINTLIST,
numParticleinBatch
// Restore state
device-&SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
好啦,这就是整个粒子系统的绘制过程了,在这里我们采用了配置文件的方式,为的是能将每个粒子系统的参数写到文件了,这样每个文件实际上就对应一个特效,我们可以通过添加配置文件的方式来实现不同的特效,核心代码部分则不用修改。
点击下载程序可以查看动态效果。
Happy Coding!!!

我要回帖

更多关于 3dmax粒子爆炸 的文章

 

随机推荐