游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2094|回复: 3

请问各位高手,三维粒子系统模型怎么建立?

[复制链接]

10

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-3-13 10:37:00 | 显示全部楼层 |阅读模式
我课题是三维动态模拟,我不知道怎么实现粒子的实时动态模拟

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 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) );       

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2006-3-30 00:56:00 | 显示全部楼层

Re:请问各位高手,三维粒子系统模型怎么建立?

最后还要

KillTimer(OGL_window->hWnd, TIMER1);

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2006-4-2 10:08:00 | 显示全部楼层

Re:请问各位高手,三维粒子系统模型怎么建立?

nehe有个SDK是关于这个的。你找一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 02:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表