第15讲 粒子系统Word文档下载推荐.docx

上传人:b****6 文档编号:20934720 上传时间:2023-01-26 格式:DOCX 页数:17 大小:242.92KB
下载 相关 举报
第15讲 粒子系统Word文档下载推荐.docx_第1页
第1页 / 共17页
第15讲 粒子系统Word文档下载推荐.docx_第2页
第2页 / 共17页
第15讲 粒子系统Word文档下载推荐.docx_第3页
第3页 / 共17页
第15讲 粒子系统Word文档下载推荐.docx_第4页
第4页 / 共17页
第15讲 粒子系统Word文档下载推荐.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第15讲 粒子系统Word文档下载推荐.docx

《第15讲 粒子系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第15讲 粒子系统Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。

第15讲 粒子系统Word文档下载推荐.docx

粒子的加速度*/

floatlifetime;

粒子生命值*/

floatdec;

粒子消失的速度*/

floatsize;

粒子尺寸*/

D3DCOLOR/*D3DCOLORVALUE*/color;

粒子的颜色*/

};

4、粒子系统类

(1)Particle.h文件

#pragmaonce

#include<

d3d9.h>

d3dx9.h>

classCParticle

public:

CParticle();

构造函数*/

virtual~CParticle();

析构函数*/

/**粒子的初始化*/

virtualboolInit(int_num);

/**粒子的渲染*/

virtualvoidRender()=0;

/**粒子的更新*/

virtualvoidUpdate()=0;

protected:

intm_iNum;

粒子总数目*/

Particle*m_pList;

/**<

粒子指针*/

(1)Particle.cpp文件

#include"

Particle.h"

/**构造函数*/

CParticle:

:

CParticle()

{

m_iNum=0;

m_pList=NULL;

}

/**析构函数*/

~CParticle()

if(m_pList!

=NULL)

{

delete[]m_pList;

m_pList=NULL;

}

/**粒子的初始化*/

boolCParticle:

Init(int_num)

m_iNum=_num;

m_pList=newParticle[m_iNum];

if(m_pList==NULL)

returnfalse;

returntrue;

/**粒子的渲染*/

voidCParticle:

Render()

{}

/**粒子的更新*/

Update()

5、粒子系统实例—雨的模拟

(1)Rain.h文件

particle.h"

structParticleVertex

D3DVECTORpos;

floatpsize;

D3DCOLORcolor;

#defineD3DFVF_PV(D3DFVF_XYZ|D3DFVF_PSIZE|D3DFVF_DIFFUSE)

classCRain:

publicCParticle

CRain(LPDIRECT3DDEVICE9pd3dDevice);

~CRain(void);

boolInit(intnum);

//初始化过程

voidRender();

//渲染过程

voidUpdate();

//更新过程

protected:

LPDIRECT3DDEVICE9m_pDevice;

//设备对象

LPDIRECT3DVERTEXBUFFER9m_pVB;

//顶点缓冲区

D3DXMATRIXm_matRain;

//世界转换矩阵

floatm_ParticleSize;

D3DXVECTOR3m_fDspeed;

(2)Rain.cpp文件

Rain.h"

CRain:

CRain(LPDIRECT3DDEVICE9pd3dDevice)

D3DXVECTOR3startp=D3DXVECTOR3(1,5,0);

D3DXVECTOR3endp=D3DXVECTOR3(3,1,0);

m_pDevice=pd3dDevice;

m_ParticleSize=5.0f;

m_fDspeed=endp-startp;

D3DXVec3Normalize(&

m_fDspeed,&

m_fDspeed);

//创建顶点缓冲区

if(FAILED(m_pDevice->

CreateVertexBuffer(sizeof(ParticleVertex)*2,

D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY|D3DUSAGE_POINTS,

D3DFVF_PV,D3DPOOL_DEFAULT,&

m_pVB,NULL)))

return;

//将粒子从粒子池转移到顶点缓冲区

ParticleVertex*p;

if(FAILED(m_pVB->

Lock(0,0,(void**)&

p,0)))

return;

p[0].pos=startp;

p[0].psize=m_ParticleSize;

p[0].color=0xffffffff;

p[1].pos=startp+m_fDspeed*m_ParticleSize;

p[1].psize=m_ParticleSize;

p[1].color=0xffffffff;

m_pVB->

Unlock();

~CRain(void)

boolCRain:

Init(intnum)

///**初始化粒子数目为num个*/

if(CParticle:

Init(num))

for(inti=0;

i<

m_iNum;

i++)

{/**初始化位置*/

floatx,y,z;

x=float(rand()%400-200);

z=float(rand()%400-200);

y=(float)(rand()%250);

m_pList[i].position=D3DXVECTOR3(x,y,z);

m_pList[i].velocity=D3DXVECTOR3(rand()%40,rand()%40,rand()%40);

/**初始化加速度—>

速度的方向//计算雨点下降方向*/

m_pList[i].acceleration=m_fDspeed;

/**初始化粒子生命时间*/

m_pList[i].lifetime=1;

/**初始化粒子的尺寸*/

m_pList[i].size=1.0f+(rand()%100);

/**初始化粒子的消失速度*/

m_pList[i].dec=0.2;

/**初始化粒子的颜色*/

m_pList[i].color=0xffffffff;

//D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);

}

}

else

/**雨的渲染*/

voidCRain:

{

/**开始渲染雨*/

for(inti=0;

++i)

{

/**如果该粒子消失或生命结束则不绘制*/

if(m_pList[i].position.y<

=0&

&

m_pList[i].lifetime<

=0)

continue;

D3DXMatrixTranslation(&

m_matRain,m_pList[i].position.x,m_pList[i].position.y,m_pList[i].position.z);

m_pDevice->

SetTransform(D3DTS_WORLD,&

m_matRain);

SetStreamSource(0,m_pVB,0,sizeof(ParticleVertex));

SetFVF(D3DFVF_PV);

DrawPrimitive(D3DPT_LINELIST,0,1);

/**更新粒子属性*/

Update();

/**雨粒子的更新*/

for(inti=0;

if(m_pList[i].position.y<

0)

m_pList[i].position.y=250.0f;

if(m_pList[i].position.x>

200||m_pList[i].position.x<

-200)

m_pList[i].position.x=(float)(rand()%400-200);

if(m_pList[i].position.z>

200||m_pList[i].position.z<

m_pList[i].position.z=(float)(rand()%400-200);

/**更新位置*/

m_pList[i].position.x+=m_pList[i].velocity.x*m_pList[i].acceleration.x*m_pList[i].size;

m_pList[i].position.y+=m_pList[i].velocity.y*m_pList[i].acceleration.y*m_pList[i].size;

m_pList[i].position.z+=m_pList[i].velocity.z*m_pList[i].acceleration.z*m_pList[i].size;

/**更新生存时间*/

m_pList[i].lifetime-=m_pList[i].dec;

/**如果粒子消失或生命结束*/

=0||m_pList[i].lifetime<

=0)

{

/**初始化位置*/

x=float(rand()%400-200);

z=float(rand()%400-200);

y=(float)(rand()%250);

m_pList[i].position=D3DXVECTOR3(x,y,z);

/**初始化生命时间*/

/**初始化消失速度*/

}

 

实现效果:

雪粒子系统的实现

(1)定义CSnowPartcileSystem类

SnowPartcileSystem.h文件

//=====================================================================

//Desc:

雪花粒子系统类头文件

//=====================================================================

UtilMacro.h"

;

//-----------------------------------------------------------------------------

//点精灵顶点结构和顶点格式

structPOINTVERTEX

floatx,y,z;

//顶点位置

floatu,v;

//顶点纹理坐标

#defineD3DFVF_POINTVERTEX(D3DFVF_XYZ|D3DFVF_TEX1)

雪花粒子结构

structSNOWPARTICLE

//位置

floatfYaw;

//雪花绕自身Y轴旋转角度

floatfPitch;

//雪花绕自身X旋转角度

floatDspeed;

//雪花下降速度

floatRspeed;

//雪花旋转速度

intTexIndex;

//纹理

粒子系统类的定义

classCSnowParticleSystem

private:

intm_num;

SNOWPARTICLE*m_Snows;

//雪花粒子数组

//保存粒子数据的顶点缓存

LPDIRECT3DDEVICE9m_pd3dDevice;

LPDIRECT3DTEXTURE9m_pTex[3];

//雪花纹理

CSnowParticleSystem(LPDIRECT3DDEVICE9pd3dDevice);

~CSnowParticleSystem();

boolInit(intnum);

voidUpdate(floatfElapsedTime);

voidRender(floatfElapsedTime);

voidDestroy();

(2)类的实现snowparticlesystem.cpp文件

雪花粒子系统类源文件

d3dx9.h"

SnowParticleSystem.h"

#defineSAFE_DELETE(p){if(p){delete(p);

(p)=NULL;

}}

#defineSAFE_DELETE_ARRAY(p){if(p){delete[](p);

#defineSAFE_RELEASE(p){if(p){(p)->

Release();

构造函数

CSnowParticleSystem:

CSnowParticleSystem(LPDIRECT3DDEVICE9pd3dDevice)

m_pd3dDevice=pd3dDevice;

m_pTex[0]=NULL;

m_pTex[1]=NULL;

m_pTex[2]=NULL;

m_pVB=NULL;

析构函数

~CSnowParticleSystem()

创建粒子纹理

boolCSnowParticleSystem:

Init(intnum)

m_num=num;

m_Snows=newSNOWPARTICLE[m_num];

//初始化雪花粒子数组

srand(GetTickCount());

m_num;

m_Snows[i].x=float(rand()%200-100);

m_Snows[i].z=float(rand()%200-100);

m_Snows[i].y=float(rand()%250);

m_Snows[i].fYaw=(rand()%100)/50.0f*D3DX_PI;

m_Snows[i].fPitch=(rand()%100)/50.0f*D3DX_PI;

m_Snows[i].Dspeed=20.0f+rand()%5;

m_Snows[i].Rspeed=1.0f+rand()%10/10.0f;

m_Snows[i].TexIndex=rand()%3;

//创建雪花粒子顶点缓存

if(FAILED(m_pd3dDevice->

CreateVertexBuffer(4*sizeof(POINTVERTEX),0,

D3DFVF_POINTVERTEX,D3DPOOL_MANAGED,&

m_pVB,NULL)))

//填充雪花粒子顶点缓存

POINTVERTEXvertices[]=

{-1,0,0,0.0f,1.0f,},

{-1,2,0,0.0f,0.0f,},

{1,0,0,1.0f,1.0f,},

{1,2,0,1.0f,0.0f,}

};

VOID*pVertices;

Lock(0,0,(void**)&

pVertices,0);

memcpy(pVertices,vertices,sizeof(vertices));

//创建雪花纹理

D3DXCreateTextureFromFile(m_pd3dDevice,L"

Media\\snow1.bmp"

&

m_pTex[0]);

D3DXCreateTextureFromFile(m_pd3dDevice,L"

Media\\snow2.bmp"

m_pTex[1]);

Media\\snow3.bm

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1