用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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华仔的技术笔记

SceneKitScene Kit 概要节点 (Nodes)光照动画开始用 Scene Kit 写游戏扩展默认渲染流程延时着色

37980
来自专栏Crossin的编程教室

【编程课堂】jieba-中文分词利器

0、前言 在之前的文章【编程课堂】词云 wordcloud 中,我们曾使用过 jieba 库,当时并没有深入讲解,所以本次将其单独列出来详细讲解。 jieba库...

386110
来自专栏CreateAMind

Curiosity-driven Exploration 好奇心代码阅读

25320
来自专栏机器学习算法与Python学习

数据压缩与信息熵

数据压缩与信息熵 1992年,美国佐治亚州的WEB Technology公司,宣布做出了重大的技术突破。该公司的DataFiles/16软件,号称可以将任意大于...

363120
来自专栏Python爬虫与算法进阶

爬取 Stackoverflow 100 万条问答并简单分析

作为一个热爱编程的大学生,怎么能不知道面向 stackoverflow 编程呢。 打开 stackoverflow 主页,在 questions 页面下选择按...

36550
来自专栏生信小驿站

R for data science (第一章)①Chapter1 使用ggplot2进行数据可视化

本章将教您如何使用ggplot2可视化您的数据。 R有几个用于制作图形的系统,但ggplot2是最优雅和最通用的系统之一。 ggplot2实现了图形语法,它是一...

12620
来自专栏老秦求学

算法一之N皇后问题

(写这篇文章主要是明天就要考试了,算法考试,今天不想再复习了,xiang着今天也开通了博客,于是在这个平台上进行复习,应该会更高效。最后祝愿我明天考个好成绩。嘻...

399100
来自专栏机器之心

教程 | 如何使用JavaScript构建机器学习模型

选自:hackernoon 作者:Abhishek Soni 参与:李泽南 目前,机器学习领域建模的主要语言是 Python 和 R,前不久腾讯推出的机器学习框...

34660
来自专栏UAI人工智能

实战派 | PaddlePaddle 你其实也可以真正地上手

19940
来自专栏大数据挖掘DT机器学习

R语言数据处理:飞机航行距离与到达延误时间有什么关系??

数据分析有一半以上的时间会花在对原始数据的整理及变换上,包括选取特定的分析变量、汇总并筛选满足条件的数据、排序、加工处理原始变量并生成新的变量、以及分组汇总数...

38740

扫码关注云+社区

领取腾讯云代金券