|
|
发表于 2006-3-30 00:55:00
|
显示全部楼层
Re:请问各位高手,三维粒子系统模型怎么建立?
#define MAXTEXTURE 1 // 定义纹理贴图数量
#define MAX_PARTICLES 1000
*********************************
GLuint texture[MAXTEXTURE]; // 纹理数组,保存纹理名字(name)
GLfloat speedFator = 1.0f; // 粒子运动速度的控制因子
GLfloat angle_Z; // 粒子旋转
static GLfloat colors[12][3]= // 粒子颜色数组
{
{0.5f, 0.5f, 1.0f}, {0.75f, 0.5f, 1.0f}, {1.0f, 0.5f, 1.0f}, {0.5f, 1.0f, 0.5f},
{1.0f, 1.0f, 0.5f}, {0.75f, 1.0f, 0.5f}, {1.0f, 0.5f, 0.5f}, {1.0f, 0.75f, 0.5f},
{1.0f, 0.5f, 0.75f}, {0.5f, 1.0f, 0.75f}, {0.5f, 1.0f, 1.0f}, {0.5f, 0.75f, 1.0f}
};
// 星空粒子系统
typedef struct
{
float life; // 粒子生命
float fade; // 粒子衰减速度
float r,g,b; // 粒子的颜色
float x,y,z; // 粒子位置
float xSpeed,ySpeed,zSpeed; // 粒子的速度
float xg,yg,zg; // 粒子的运动加速度
} PARTICLES;
PARTICLES particle[MAX_PARTICLES];
// 初始化星空粒子系统
void ParticleInit(void)
{
for (int loop=0; loop<MAX_PARTICLES; ++loop)
{
particle[loop].life = 1.0f; // 赋予每个粒子完整生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机生命衰减速度
particle[loop].r = colors[rand()%12][0]; // 粒子颜色的红色分量
particle[loop].g = colors[rand()%12][1]; // 粒子颜色的绿色分量
particle[loop].b = colors[rand()%12][2]; // 粒子颜色的蓝色分量
particle[loop].xSpeed = float((rand()%300)-150.0f); // 沿x轴的随机速度(-150,150)
particle[loop].ySpeed = float((rand()%300)-150.0f); // 沿y轴的随机速度(-150,150)
particle[loop].zSpeed = float(rand()%150); // 沿z轴的随机速度(0,150)
particle[loop].xg = 0.0f; // 沿x轴的加速度
particle[loop].yg = 0.0f; // 沿y轴的加速度
particle[loop].zg = 8.0f; // 沿z轴的加速度
}
}
void DrawParticle(void)
{
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 选择混合方式
float x,y,z;
for (int loop=0; loop<MAX_PARTICLES; ++loop) // 循环绘制
{
x = particle[loop].x; // 定义粒子坐标
y = particle[loop].y;
z = particle[loop].z;
// 用glColor4f绘制粒子的颜色和透明度(生命),用life减fade即可得到粒子的生命变化
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life);
glBegin(GL_TRIANGLE_STRIP); // 绘制粒子
glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.5f, y + 0.5f, z);
glTexCoord2d(0.0f, 1.0f); glVertex3f(x - 0.5f, y + 0.5f, z);
glTexCoord2d(1.0f, 0.0f); glVertex3f(x + 0.5f, y - 0.5f, z);
glTexCoord2d(0.0f, 0.0f); glVertex3f(x - 0.5f, y - 0.5f, z);
glEnd();
// 粒子位置更新
particle[loop].x += particle[loop].xSpeed/(speedFator*1000.0f); // x轴上的位置
particle[loop].y += particle[loop].ySpeed/(speedFator*1000.0f); // y轴上的位置
particle[loop].z += particle[loop].zSpeed/(speedFator*1000.0f); // z轴上的位置
// 粒子速度更新
particle[loop].xSpeed += particle[loop].xg;
particle[loop].ySpeed += particle[loop].yg;
particle[loop].zSpeed += particle[loop].zg;
particle[loop].life -= particle[loop].fade; // 粒子生命的衰减
if (particle[loop].life <= 0.0f) // 如果粒子衰减到0
{
particle[loop].life = 1.0f; // 赋予新生命
particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机衰减速度
particle[loop].x = 0.0f; // 新粒子在(0.0f,0,0f,0.0f)处
particle[loop].y = 0.0f;
particle[loop].z = 0.0f;
particle[loop].xSpeed = float((rand()%60)-30.0f); // x轴速度与方向
particle[loop].ySpeed = float((rand()%60)-30.0f); // y轴速度与方向
particle[loop].zSpeed = float(rand()%30); // z轴速度与方向
particle[loop].r = colors[rand()%12][0]; // 选择随机颜色的(r,g,b)值
particle[loop].g = colors[rand()%12][1];
particle[loop].b = colors[rand()%12][2];
}
}
}
*************************************
// 建立时钟
SetTimer(window->hWnd, TIMER1, 33, NULL);
srand( (unsigned)time(NULL) ); |
|