一、目的:

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

二、代码:

Github地址

#include "stdafx.h"
#include <GL/glut.h>
#include <stdlib.h> //srand和rand
#include <time.h> //time(int) const int N = ;
float particles[N][];
float rtri = ; // 初始化材质属性、光源、光照模型、深度缓冲区
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 = ; i < N; i++) {
for (int j = ; j < ; j++) {
particles[i][j] += (rand() % / 800.0 - 0.5) / ;
}
} 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 = ; i < N; i++) {
glPushMatrix();
//平移到第i个粒子位置
glTranslatef(particles[i][], particles[i][], particles[i][]);
glutSolidSphere(0.02, , );
glPopMatrix();
} rtri += 0.5f;//加一个角度
glutSwapBuffers();//交换双缓存
} void reshape(int width, int height)
{
glViewport(, , 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 : //ESC键
exit();
break;
default:
break;
}
} int main(int argc, char** argv)
{
//seed初始化随机数函数
srand((unsigned int)time()); //random seeds
for (int i = ; i < N; i++) {
for (int j = ; j < ; j++) {
particles[i][j] = (rand() % / 800.0 - 0.5) * ;
}
}
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存
glutInitWindowSize(, );
glutInitWindowPosition(, );
glutCreateWindow("粒子群");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(display);//设置空闲时调用的函数
glutMainLoop();
return ;
}

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

  1. 音视频开发之H.264 入门知识

    大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...

  2. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

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

    效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numpar ...

  4. OpenGL快问快答

    OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...

  5. OpenGL ES crash notes 01 - Nice to meet you

    这篇笔记完全参照<OpenGL.ES.3.0.Programming.Guide.2nd.Edition>,摘出部分内容只为学习参考. 为什么要用英文:无论是D3D的SDK还是OES的Sp ...

  6. 太阳系Demo(openGL)

    这个是8年前写的demo,提交的一份作业,按照提出的需求点,以最快和最简单的方式完成功能,因此代码比较简单. 1)截图 2) 功能点描述: 1.公转,自传 2.基础的摄像机运动 3.正视和顶视 4.天 ...

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

    简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一 ...

  8. ANDROID模拟火花粒子的滑动喷射效果

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 年前换了一个手机,SONY的Z3C.这个手机在解锁屏幕时有一个滑动动画,类似火 ...

  9. NeHe OpenGL教程 第四十课:绳子的模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 制做rpm包工具fpm安装

    安装ruby模块 [root@c01 ~]# yum install ruby rubygems ruby-devel -y # 查看当前使用的rubygems仓库 [root@c01 ~]# gem ...

  2. 菜鸟学SSH(二)——Struts2国际化手动切换版

    国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化.程序在不修改内部代 ...

  3. Advanced DataStream API Low-latency Event Time Join

    http://training.data-artisans.com/exercises/eventTimeJoin.html

  4. angular的uiRouter服务学习(4)

    本篇接着上一篇angular的uiRouter服务学习(3)继续讲解uiRouter的用法 本篇主要讲解uiRouter的url路由 大多数情况下,状态是和url相关联的: 当url改变,激活对应的状 ...

  5. play with variadic template

    我曾在公司内部的一次技术培训课程中讲到如何展开可变模板参数的问题,具体来说是如何打印可变模板参数,我初略数了一下,有很多种,下面来看看到底有多少种不同的方法展开可变模板参数吧. //展开变参的N种方法 ...

  6. Lintcode: Longest Common Substring 解题报告

    Longest Common Substring 原题链接: http://lintcode.com/zh-cn/problem/longest-common-substring/# Given tw ...

  7. JAVA-JSP内置对象之out对象进行页面输出

    相关资料:<21天学通Java Web开发> out对象 out对象进行页面输出1.通过out对象的print()方法和println()方法进行页而输出.2.不同的println()方法 ...

  8. Java heap space cdh 5.11.1

    在执行hive count 查询的时候报错:Error: Java heap space 解决办法是 set io.sort.mb=10; 执行hadoop的Exeample的时候报错,也是java ...

  9. # Writing your-first Django-app-part 5 -test

    确认bug 写test测试暴露bug 修复bug 更多测试例子 测试一个view The Django test client测试客户端. 提升DemoAppPoll/views.py 测试我们的vi ...

  10. spring-retry的简单使用

    添加Maven依赖: <dependency> <groupId>org.springframework.retry</groupId> <artifactI ...