Direct-X学习笔记--三维粒子系统

哇塞,一转眼已经到了传说中的粒子系统了,学会了粒子系统就可以做出一些更好玩的效果啦!加油啦!


一.简介

粒子系统,正如其名称,由各种小的粒子构成。通常用来模拟火焰,爆炸,烟,水流,火花,落叶,雨,雪等等难以用具体的形状来描述的物体。单个的粒子非常简单,可以用多边形来表示,甚至用像素表示。但是,不要小看了这样微小的粒子,当粒子的数量级达到上千,上万,甚至十万时,表现力是及其震撼的!

下面附上两张DX自带的粒子系统的截图:


帅呆了...然而我并做不出来...


粒子系统有三个特性:

1.群体性:粒子如此微小,要想成大气候,就必须聚集起来。

2.统一性:每个粒子性质相同。

3.随机性:粒子系统中的元素会随机表现出不同的特性。

简单的概括就是,整体有一致的表现,但是单独的粒子可以有不同的表现。


粒子系统的基本原理,即粒子系统的生命周期:

1.产生新的粒子

2.更新现有粒子的属性

3.删除已经消亡的粒子

4.绘制粒子


通常一次性分配足够的空间,通过数据结构管理存在的粒子以及消亡的粒子,如果粒子消亡了,不显示即可。

二.封装一个粒子系统的类

按照浅墨大大的方法,写了一个雪花飘落的粒子系统:

.h文件

/*!
 * \file Particle.h
 *
 * \author puppet_master
 * \date 八月 2015
 *
 * 粒子系统的实现
 */
#ifndef __CPARTICLE_H_
#define __CPARTICLE_H_
#include "stdafx.h"

#pragma once
//粒子定点格式
struct POINTVERTEX
{
	float x, y, z;
	float u, v;
};
#define D3DFVF_POINTVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

//粒子结构体定义
struct ParticleStruct
{
	float x, y, z;				//坐标
	float rotationX;			//绕X轴旋转角度
	float rotationY;			//绕Y轴旋转角度
	float speed;				//下落速度
	float rotationSpeed;		//旋转速度
};

const int PARTICLE_NUMBER = 3000;			//粒子数量
const int AREA_WIDTH = 10000;				//粒子系统区域宽度
const int AREA_LENGTH = 10000;				//粒子系统区域长度
const int AREA_HEIGHT = 10000;				//粒子系统区域高度

class CParticle
{
private:

	LPDIRECT3DDEVICE9 m_pDevice;					//设备指针
	ParticleStruct m_Particle[PARTICLE_NUMBER];		//粒子结构体数组
	LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;		//顶点缓冲区
	LPDIRECT3DTEXTURE9 m_pTexture;					//粒子纹理
public:
	CParticle(LPDIRECT3DDEVICE9);
	virtual ~CParticle(void);

	//初始化粒子系统
	bool InitParticle();
	//更新粒子
	bool UpdateParticle(float);
	//绘制粒子
	bool RenderParticle();
};

#endif



.cpp文件

#include "stdafx.h"
#include "Particle.h"
#include <time.h>


CParticle::CParticle(LPDIRECT3DDEVICE9 pDevice)
{
	m_pDevice = pDevice;
	m_pVertexBuffer = NULL;
	m_pTexture = NULL;
}


CParticle::~CParticle(void)
{
	SAFE_RELEASE(m_pVertexBuffer);
	SAFE_RELEASE(m_pTexture);
}

bool CParticle::InitParticle()
{
	srand((unsigned int)time(0));
	//初始化雪花粒子数组
	for(int i = 0; i < PARTICLE_NUMBER; i++)
	{
		m_Particle[i].x = rand() % AREA_LENGTH - AREA_LENGTH / 2;
		m_Particle[i].y = rand() % AREA_HEIGHT;
		m_Particle[i].z = rand() % AREA_WIDTH - AREA_WIDTH / 2;
		m_Particle[i].speed = 500 + rand() % 500;
		m_Particle[i].rotationSpeed = 5.0f + rand() % 10 / 10.0f;
	}

	//创建雪花粒子顶点缓存
	m_pDevice->CreateVertexBuffer(4 * sizeof(POINTVERTEX), 0, D3DFVF_POINTVERTEX, D3DPOOL_MANAGED, &m_pVertexBuffer, NULL);

	//填充顶点缓存
	POINTVERTEX vertices[] = 
	{
		{-10.0f, 0.0f, 0.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值