×
Namespaces

Variants
Actions

使用OpenGL ES实现粒子效果

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
文章
zengcity 在 20 Jan 2010 创建
最后由 hamishwillee 在 15 Dec 2011 编辑


实现代码

主要参考NeHe的OpenGL的粒子效果实现.

关键代码:

数据定义:

#define	MAX_PARTICLES	100				// 定义最大的粒子数
bool rainbow = true; // 是否为彩虹模式
bool sp; // 空格键是否被按下
bool rp; // 回车键是否被按下
float slowdown = 2.0f; // 减速粒子
float xspeed; // X方向的速度
float yspeed; // Y方向的速度
float zoom = -40.0f; // 沿Z轴缩放
GLuint loop; // 循环变量
GLuint col; // 当前的颜色
GLuint delay; // 彩虹效果延迟
typedef struct // 创建粒子数据结构
{
bool active; // 是否激活
float life; // 粒子生命
float fade; // 衰减速度
float r; // 红色值
float g; // 绿色值
float b; // 蓝色值
float x; // X 位置
float y; // Y 位置
float z; // Z 位置
float xi; // X 方向
float yi; // Y 方向
float zi; // Z 方向
 
float xg; // X 方向重力加速度
float yg; // Y 方向重力加速度
float zg; // Z 方向重力加速度
} particles; // 粒子数据结构
particles particle[MAX_PARTICLES]; // 保存1000个粒子的数组

数据初始化:

for (loop = 0; loop < MAX_PARTICLES; loop++) //初始化所有的粒子
{
particle[loop].active = true; // 使所有的粒子为激活状态
particle[loop].life = 1.0f; // 所有的粒子生命值为最大
particle[loop].fade = float(Math::Random() % 100) / 1000.0f + 0.003f; // 随机生成衰减速率
particle[loop].r = colors[loop * (12 / MAX_PARTICLES)][0]; // 粒子的红色颜色
particle[loop].g = colors[loop * (12 / MAX_PARTICLES)][1]; // 粒子的绿色颜色
particle[loop].b = colors[loop * (12 / MAX_PARTICLES)][2]; // 粒子的蓝色颜色
particle[loop].xi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成X轴方向速度
particle[loop].yi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成Y轴方向速度
particle[loop].zi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成Z轴方向速度
particle[loop].xg = float(Math::Random() % 50) / 1000.0f; // 设置X轴方向加速度为0
particle[loop].yg = float(Math::Random() % 50) / 1000.0f; // 设置Y轴方向加速度为-0.8
particle[loop].zg = float(Math::Random() % 50) / 1000.0f; // 设置Z轴方向加速度为0
}

绘制:

void CParticles::DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
 
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
// glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_CURRENT_BIT
// | GL_LIGHTING_BIT | GL_TRANSFORM_BIT | GL_TEXTURE_BIT);
 
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
 
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
 
glEnable(GL_TEXTURE_2D);
 
//以上代码使黑色透明
 
//glLoadIdentity(); // 重置当前的模型观察矩阵
/***********************************新添的代码***********************************************************************************/
for (loop = 0; loop < MAX_PARTICLES; loop++) // 循环所有的粒子
{
if (particle[loop].active) // 如果粒子为激活的
{
float x = particle[loop].x; // 返回X轴的位置
float y = particle[loop].y; // 返回Y轴的位置
float z = particle[loop].z + zoom; // 返回Z轴的位置
// 设置粒子颜色
 
glPushMatrix();
 
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b,
particle[loop].life);
 
glTranslatef(x, y, z);
glBindTexture(GL_TEXTURE_2D, iOpenGLES.iID);
glDrawElements(GL_TRIANGLES, 2 * 3, GL_UNSIGNED_BYTE, triangles);
 
glPopMatrix();
 
// glBegin(GL_TRIANGLE_STRIP); // 绘制三角形带
// glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
// glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
// glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
// glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);
// glEnd();
 
particle[loop].x += particle[loop].xi / (slowdown * 1000); // 更新X坐标的位置
particle[loop].y += particle[loop].yi / (slowdown * 1000); // 更新Y坐标的位置
particle[loop].z += particle[loop].zi / (slowdown * 1000); // 更新Z坐标的位置
particle[loop].xi += particle[loop].xg; // 更新X轴方向速度大小
particle[loop].yi += particle[loop].yg; // 更新Y轴方向速度大小
particle[loop].zi += particle[loop].zg; // 更新Z轴方向速度大小
particle[loop].life -= particle[loop].fade; // 减少粒子的生命值
if (particle[loop].life < 0.0f) // 如果粒子生命值小于0
{
particle[loop].life = 1.0f; // 产生一个新的粒子
particle[loop].fade = float(Math::Random() % 100) / 1000.0f
+ 0.003f; // 随机生成衰减速率
particle[loop].x = 0.0f; // 新粒子出现在屏幕的中央
particle[loop].y = 0.0f;
particle[loop].z = 0.0f;
 
// particle[loop].xi = xspeed + float((Math::Random() % 60)
// - 32.0f); // 随机生成粒子速度
// particle[loop].yi = yspeed + float((Math::Random() % 60)
// - 30.0f);
// particle[loop].zi = float((Math::Random() % 60) - 30.0f);
 
particle[loop].xi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成X轴方向速度
particle[loop].yi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成Y轴方向速度
particle[loop].zi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成Z轴方向速度
particle[loop].xg=float(Math::Random()%50)/1000.0f; // 设置X轴方向加速度为0
particle[loop].yg=float(Math::Random()%50)/1000.0f; // 设置Y轴方向加速度为-0.8
particle[loop].zg=float(Math::Random()%50)/1000.0f; // 设置Z轴方向加速度为0
 
 
particle[loop].r = colors[col][0]; // 设置粒子颜色
particle[loop].g = colors[col][1];
particle[loop].b = colors[col][2];
}
}
}
}

效果预览

Partical.JPG



工程下载

File:OpenGLParticles.zip

This page was last modified on 15 December 2011, at 08:00.
94 page views in the last 30 days.
×