资源简介
一个基于DirectX3D的粒子系统,包含源文件,和一个烟火的示例。

代码片段和文件信息
#include “EpParticleSystem.h“
#include
#include
EpParticleSystem::EpParticleSystem( D3DVECTOR position D3DVECTOR range
D3DVECTOR acceleration D3DVECTOR emitterPositionMin D3DVECTOR emitterPositionMax
D3DVECTOR velocityMin D3DVECTOR velocityMax D3DCOLORVALUE colorMin
D3DCOLORVALUE colorMax float psizeMin float psizeMax
int maxCount int emitCount float emitInterval
LPDIRECT3DDEVICE9 device LPDIRECT3DTEXTURE9 texture )
{
m_Pos = position;
m_Range = range;
m_Accel = acceleration;
m_EmiPosMin = emitterPositionMin;
m_EmiPosMax = emitterPositionMax;
m_VeloMin = velocityMin;
m_VeloMax = velocityMax;
m_ColorMin = colorMin;
m_ColorMax = colorMax;
m_PSizeMin = psizeMin;
m_PSizeMax = psizeMax;
m_Count = 0;
m_MaxCount = maxCount;
m_EmiCount = emitCount;
m_EmiInterval = emitInterval;
m_Interval = 0.0f;
m_pDevice = device;
m_pTexture = texture;
m_Particles = NULL;
m_pVB = NULL;
//随机数种子
srand( (unsigned)time( NULL ) );
//计算世界矩阵
D3DXMatrixTranslation(&m_WorldMat m_Pos.x m_Pos.y m_Pos.z);
}
bool EpParticleSystem::Initialize()
{
if (m_pDevice == NULL)
{
return false;
}
//构建粒子池
m_Particles = new EpParticle[m_MaxCount];
if (m_Particles == NULL)
{
return false;
}
//创建顶点缓冲区
if(FAILED(m_pDevice->CreateVertexBuffer(sizeof(stParticleVertex) * m_MaxCount
D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY | D3DUSAGE_POINTS
D3DFVF_PARTICLE D3DPOOL_DEFAULT &m_pVB NULL)))
return false;
return true;
}
void EpParticleSystem::Update( float delta )
{
EpParticle *p = NULL;
for (int i = 0; i < m_Count; i++)
{
//改变粒子的速度与位置
p = &m_Particles[i];
p->pos += p->velo;
p->velo += m_Accel;
//检查粒子是否超出边界
if (!(p->pos.x <= m_Range.x/2 && p->pos.x >= -m_Range.x/2 &&
p->pos.y <= m_Range.y/2 && p->pos.y >= -m_Range.y/2 &&
p->pos.z <= m_Range.z/2 && p->pos.z >= -m_Range.z/2 ))
{
//将最后一个粒子移到该位置
m_Particles[i] = m_Particles[m_Count-1];
m_Count--; //抛弃最后一个粒子
i--; //重新检查该粒子
}
}
//发射粒子
m_Interval += delta;
if (m_Interval >= m_EmiInterval)
{
emit(m_EmiCount);
m_Interval -= m_EmiInterval;
}
}
//生成随机数
float rangeRand( float min float max )
{
return (float)rand() / RAND_MAX * (max - min) + min;
}
//发射一定数量的粒子
void EpParticleSystem::emit( int emitCount )
{
EpParticle *p = NULL;
for (int i = 0; i < emitCount; i++)
{
if (m_Count == m_MaxCount) break;
p = &m_Particles[m_Count];
p->pos.x = rangeRand(m_EmiPosMin.x m_EmiPosMax.x);
p->pos.y = rangeRand(m_EmiPosMin.y m_EmiPosMax.y);
p->pos.z = rangeRand(m_EmiPosMin.z m_EmiPosMax.z);
p->velo.x = rangeRand(m_VeloMin.x m_VeloMax.x);
p->velo.y = rangeRand(m_VeloMin.y m_VeloMax.y);
p->velo.z = rangeRand(m_VeloMin.z m_VeloMax.z);
p->psize = rangeRand(m_PSizeMin m_PSizeMax);
p->color.r = rangeRand(m_ColorMin.r m_ColorMax.r);
p->color.g = rangeRand(m_ColorMin.g m_ColorMax.g);
p->color.
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4850 2009-09-12 14:32 EpParticleSystem.cpp
文件 1728 2009-09-12 14:32 EpParticleSystem.h
文件 5035 2009-09-12 14:20 main.cpp
文件 13349 2006-04-12 02:22 snow.tga
文件 13824 2009-09-12 16:02 EpParticleSystem.exe
----------- --------- ---------- ----- ----
38786 5
相关资源
- 3D绘图程序设计:使用Direct3D 10/9和Ope
- D3D烟花粒子
- Direct3d做的演示程序有源代码
- 粒子系统画的心形线
- Direct3D Rendering Cookbook
- d3d9_2.exe
- e92d3d2f5aef63448696ba0aa5ef9ed1.pdf
- 20101028 DirectX(粒子系统改)
- D3D9 SDK中文文档
- 运用DirectX9绘制太阳系
- DirectX3D太阳系
- OPENGL粒子系统之喷泉
- Game-EC 驱动辅助模块8.4 D3D透视版
- 基于D3D的魔方小程序
- 基于D3D的YV12视频渲染 更新
- D3D11_DirectionalShadowMap
- d3dx9_27.DLL
- 最简单的视音频播放 1.1
- 最简单的视音频播放
- 简单的D3D9纹理共享
- Direct3D中的2D编程中文版.pdf
- Jiggly Bubble 1.31.unitypackage
- D3D11_DerfferredShading
- 3Dmax 烟花
- 火焰渲染的粒子系统程序,单文档工
- 原创3D游戏引擎源代码
- 太阳地球月亮旋转公转自转
- Ray and AABB Collision.rar
- D3D11_ShadowMap1
- D3D中.X模型文件
评论
共有 条评论