用OpenGL实现粒子的随机运动

一、目的:

掌握OpenGL中粒子的绘制、随机数的使用

二、代码:

#include "stdafx.h"
#include <GL/glut.h>
#include <stdlib.h>   //srand和rand
#include <time.h>   //time(int)

const int N = 2000;
float particles[N][3];
float rtri = 0;

// 初始化材质属性、光源、光照模型、深度缓冲区
void init(void)
{
    //材质反光性设置
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };  //镜面反射参数
    GLfloat mat_shininess[] = { 50.0 };               //高光指数
    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
    GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };   //灯位置(1,1,1), 最后1-开关
    GLfloat Light_Model_Ambient[] = { 1.0, 0.2, 0.5, 0.1 }; //环境光参数

    glClearColor(0.0, 0.0, 0.0, 0.0);  //背景色
    glShadeModel(GL_SMOOTH);           //多变性填充模式

    //材质属性
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

    //灯光设置
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);   //散射光属性
    glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);  //镜面反射光
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient);  //环境光参数

    glEnable(GL_LIGHTING);   //开关:使用光
    glEnable(GL_LIGHT0);     //打开0#灯
    glEnable(GL_DEPTH_TEST); //打开深度测试
}

void display(void)
{
    //通过循环更新每个粒子的位置
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 3; j++) {
            particles[i][j] += (rand() % 800 / 800.0 - 0.5) / 100;
        }
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            //清除颜色缓存和深度缓存

    glLoadIdentity();   //装入单位转换矩阵

    //平移
    glTranslatef(0.0f, 0.0f, -4.0f);//总体旋转
    glRotatef(rtri, 0.1, 1.0, 0.1);
    //每个粒子的位置变动
    for (int i = 0; i < N; i++) {
        glPushMatrix();
        //平移到第i个粒子位置
        glTranslatef(particles[i][0], particles[i][1], particles[i][2]);
        glutSolidSphere(0.02, 20, 16);
        glPopMatrix();
    }

    rtri += 0.5f;//加一个角度
    glutSwapBuffers();//交换双缓存
}

void reshape(int width, int height)
{
    glViewport(0, 0, width, height);

    //投影模式
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //设置斜投影矩阵参数
    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 600.0f);

    //模型-视图矩阵模式
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case ‘x‘:
    case ‘X‘:
    case 27:   //ESC键
        exit(0);
        break;
    default:
        break;
    }
}

int main(int argc, char** argv)
{
    //seed初始化随机数函数
    srand((unsigned int)time(0));    //random seeds
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 3; j++) {
            particles[i][j] = (rand() % 800 / 800.0 - 0.5) * 2;
        }
    }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存
    glutInitWindowSize(800, 800);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("粒子群");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);
    glutIdleFunc(display);//设置空闲时调用的函数
    glutMainLoop();
    return 0;
}

时间: 2024-10-24 11:15:18

用OpenGL实现粒子的随机运动的相关文章

马尔科夫随机场的基本概念

1.随机过程: 描述某个空间上粒子的随机运动过程的一种方法.它是一连串随机事件动态关系的定量描述.随机过程与其它数学分支,如微分方程.复变函数等有密切联系,是自然科学.工程科学及社会科学等领域研究随机现象的重要工具. 2.马尔科夫随机过程: 是随机过程的一种,其原始模型为马尔科夫链,由俄国数学家马尔科夫于1907年提出.其主要特征是:在已知目前状态(现在)的条件下,它未来的变化(将来)不依赖于以往的变化,而仅仅跟目前所处的状态有关.在现实世界中,很多随机过程都是马尔科夫随机过程,例如:液体中粒子

马尔科夫场基本概念

马尔科夫场基本概念 转自:http://blog.csdn.net/carson2005/article/details/39367481 1.随机过程: 描述某个空间上粒子的随机运动过程的一种方法.它是一连串随机事件动态关系的定量描述.随机过程与其它数学分支,如微分方程.复变函数等有密切联系,是自然科学.工程科学及社会科学等领域研究随机现象的重要工具. 2.马尔科夫随机过程: 是随机过程的一种,其原始模型为马尔科夫链,由俄国数学家马尔科夫于1907年提出.其主要特征是:在已知目前状态(现在)的

机器学习---算法---马尔科夫

转自:https://blog.csdn.net/pipisorry/article/details/46618991 1.确定性模式(Deterministic Patterns):确定性系统 考虑一套交通信号灯,灯的颜色变化序列依次是红色-红色/黄色-绿色-黄色-红色.这个序列可以作为一个状态机器,交通信号灯的不同状态都紧跟着上一个状态. 注意每一个状态都是唯一的依赖于前一个状态,所以,如果交通灯为绿色,那么下一个颜色状态将始终是黄色--也就是说,该系统是确定性的.确定性系统相对比较容易理解

OpenGL小试牛刀第二季(粒子模拟)

效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numparticle = 0; } /** 析构函数 */CParticle::~CParticle(){ delete []data; data = NULL;} /** 创建一个包含num个元素的粒子数组 */int CParticle::Create(long num){ /** 删除粒子数组 */ if (da

基于Windows API的粒子随机运动C++实现

基于Windows API编写Windows动画演示程序,具有便捷.不依赖于IDE的特点. 以随机运动粒子系统为例,实现了该动画框架,C++代码与效果图像如下: #include <windows.h> #include <vector> using namespace std; //粒子数量 #define N 1024 //粒子类型 typedef struct Particle { float x, y; float speedx, speedy; COLORREF rgb;

OPENgl入门过程中遇到的问题

开发内容大概为: 使用库文件注册一个绘制窗口并命名.使用OpenGL绘制两个长方体当作动画短片的空间.在两个空间之间绘制一个管道,使得在第一个空间的小球可以通过该管道运动至另一空间.制作若干小球,使它们在第一个空间随机运动,并有一定几率运动到第二个空间中去.给空间中添加光照与材质为每个模型添加纹理利用碰撞实现小球在撞击空间边缘时产生特定的碰撞效果(类似爆炸闪光效果).在第一个空间中通过粒子来实现四个"喷射"动作特效渲染环境. 问题一:  使用实验一所使用的控制台方式,不适合本实验的方式

cocos基础教程(8)粒子效果

简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一个强大的粒子系统它必然具备了多种多样的属性,这样才能配置出多样的粒子.下面就来看看粒子系统的主要属性吧. 主要属性: _duration 发射器生存时间,即它可以发射粒子的时间,注意这个时间和粒子生存时间不同.单位秒,-1表示永远:粒子发射结束后可点击工具栏的播放按钮再次发射 _emissionRa

cocos2D-X源码讲解之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构

 个人原创,欢迎转载,转载请注明原文地址http://blog.csdn.net/bill_man 从本篇文章开始,将分析cocos2D-X 3.0源代码,第一部分是从cocos2D-X学习OpenGL,也就是分析cocos2D-X 3.0的渲染代码,本篇首先介绍cocos2D-X 3.0的渲染结构,使用的是3.0正式版. void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) { //只有一种情况会调用到这里来,

[OpenGL] 简单二维粒子系统——烟花,喷水,落叶

参考代码:http://download.csdn.net/detail/blue6333589/6785389 在这个代码的基础上扩展了二维粒子系统的框架,该系统由一个发射器类和一个粒子类组成,作为编程练习而言,我们只实现了最基本的粒子系统功能,但是已经可以做出一些效果了. 在这里,通过调节参数给出了在这个框架下烟花.喷水.落叶的代码,参考代码实现的是飘雪:只要在物理参数模拟和贴图选择上做得足够好,也可以实现火焰.爆炸等效果. 发射器 其中发射器类支持从点发射和从直线发射,暂时不支持曲线(编程