用OpenGL实现粒子的随机运动
一、目的:
掌握OpenGL中粒子的绘制、随机数的使用
二、代码:
#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实现粒子的随机运动的更多相关文章
- 音视频开发之H.264 入门知识
大家如果有做过音视频相关的项目,那么肯定对 H.264 相关的概念了解的比较通透,这里我为什么还要写这样一篇文章呢?一来是为了对知识的总结,二来是为了给刚入门音视频的同学一个参考. 基础概念 H.26 ...
- 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!
概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...
- OpenGL小试牛刀第二季(粒子模拟)
效果截图:粒子模拟代码展示:#include "Particle.h" /** 构造函数 */CParticle::CParticle(){ data = NULL; numpar ...
- OpenGL快问快答
OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...
- OpenGL ES crash notes 01 - Nice to meet you
这篇笔记完全参照<OpenGL.ES.3.0.Programming.Guide.2nd.Edition>,摘出部分内容只为学习参考. 为什么要用英文:无论是D3D的SDK还是OES的Sp ...
- 太阳系Demo(openGL)
这个是8年前写的demo,提交的一份作业,按照提出的需求点,以最快和最简单的方式完成功能,因此代码比较简单. 1)截图 2) 功能点描述: 1.公转,自传 2.基础的摄像机运动 3.正视和顶视 4.天 ...
- cocos基础教程(8)粒子效果
简介 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方便. 粒子属性 一 ...
- ANDROID模拟火花粒子的滑动喷射效果
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 年前换了一个手机,SONY的Z3C.这个手机在解锁屏幕时有一个滑动动画,类似火 ...
- NeHe OpenGL教程 第四十课:绳子的模拟
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- git clean 小结
删除 一些 没有 Git add 的 文件: git clean 参数 -n 显示 将要 删除的 文件 和 目录 -f 删除 文件,-df 删除 文件 和 目录 git clean -n git c ...
- javascript基础拾遗(五)
1.什么是箭头函数 ES6引入的一种新的函数,类似匿名函数,x=>xx 箭头左端为函数参数,右端为函数体 相当于 function (x){ retutn xx } 2.箭头函数的特点 更简洁 ...
- Python:sitecustomize 和 usercustomize
Python提供了两个hook用于定制Python:sitecustomize 和 usercustomize,首先需要查看site包目录, 然后就可以在此目录下创建usercustomize.py文 ...
- 使用Maven对JAVA程序打包-带主类、带依赖【转】
很多时候,我们需要对编写的程序进行打包,这个时候,我们可以借助一些项目构建工具,如maven, sbt, ant等,这里我使用的是maven. 打包成可执行有主类的jar包(jar包中无依赖) 以下是 ...
- ThinkPad X220 完美黑苹果 Hackintosh OS X 10.11 El Capitan
原文链接:https://www.gaojinan.com/thinkpad-x220-hackintosh-osx-10-11-el-capitan-perfect.html //Update 20 ...
- js生成二维码实例
<!DOCTYPE html><html><head> <title></title> <meta charset=&qu ...
- idea linux 启动权限不足的问题
修改 ideaproject 下所有文件 chmod -R 777 文件 递归修改文件权限
- jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
使用2008的数据库, 我已经引入的sqljdbc4的包,单还是报这个错,很奇怪突然想到在配置hibernate的时候,是拷贝下来的代码 然后到网上查了下, 因为是2008的版本驱动和2000的有点不 ...
- Badboy+Jmeter进行性能测试
摸索了两天,终于搞定! 目的:使用Badboy和Jmeter添加5000个系统用户 一开始用Badboy进行批量添加,想先在excel中准备好5000个用户名,再导入到Badboy中.但是一直不成功, ...
- jQuery笔记二——基础/动画
1. jQuery的基础语法: $(selector).action() 2. 很多jQuery的语句放在ready里面 $(document).ready(function(){ // jQuery ...