位置: 编程技术 - 正文

windows visual studio 基于openGL的粒子系统设计

编辑:rootadmin

推荐整理分享windows visual studio 基于openGL的粒子系统设计,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

这是我上计算机三维动画的时候的期末作业,自己动手做的能实现粒子系统的效果,同时代码很简单,

只有一个cpp文件,很适合想要理解粒子系统原理的童鞋,童鞋可以拷贝代码修改,从而加深粒子系统的概念理解

所以的东西均为原创,希望自己能写出更多的简单而又全的例子帮大家更好的理解计算机的中很多看&#;复杂的东西

希望大家多多支持我

首先上效果图

windows visual studio 基于openGL的粒子系统设计

下面是代码,带有注释(PS:如果环境不会配置的童鞋可以查看我博客的另外的文章,有专门描述如何搭建windows visual studio openGL的开发环境)

stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include <windows.h>#include "targetver.h"#include <iostream>#include <stdio.h>#include <tchar.h>#include <gl/GLU.h>#include <gl/GL.h>#include <gl/glut.h>// TODO: 在此处引用程序需要的其他头文件

MMParcticle.cpp

#include "stdafx.h"#define MAX_PARTICLES #define RANDX rand()%-.0f // 粒子发射器X轴随机位置#define RANDZ rand()%-.0f //粒子发射器Z轴随机位置// 粒子系统参数float emmiterY = .0f;float emmiterX = 0.0f;float emmiterZ = 0.0f;float slowdown = 1.0f; // 加速减速因子float xSpeed;float ySpeed;float zoom = -.0f;GLuint loop;GLuint col;GLuint delay;// 相机移动参数float angle = 0.0f;float lx=0.0f,lz=-1.0f;// XZ position of the camerafloat x=0.0f,z=5.0f;// 粒子的结构体typedef struct{bool active; // 是否处于激活状态float life; // 生命&#;float fade; // 生命&#;衰减速度// 颜色float r; float g;float b;// 位置float x;float y;float z;// 速度矢量float xi;float yi;float zi;// 加速度矢量float xg;float yg;float zg;}particles;// 粒子数组particles particle[MAX_PARTICLES];// 粒子颜色static GLfloat colors[][3]={{1.0f,0.5f,0.5f},{1.0f,0.f,0.5f},{1.0f,1.0f,0.5f},{0.f,1.0f,0.5f},{0.5f,1.0f,0.5f},{0.5f,1.0f,0.f},{0.5f,1.0f,1.0f},{0.5f,0.f,1.0f},{0.5f,0.5f,1.0f},{0.f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.f}};// 纹理创建#define checkImageWidth 4#define checkImageHeight 4static GLubyte checkImage[checkImageHeight][checkImageWidth][4];// 纹理唯一ID索引static GLuint texName;// 用于载入纹理(目前尚未使用)void makeCheckImage(void){int i, j, c;for (i = 0; i < checkImageHeight; i&#;&#;) {for (j = 0; j < checkImageWidth; j&#;&#;) {//c = ((((i&0x8)==0)^((j&0x8))==0))*;checkImage[i][j][0] = (GLubyte) ;checkImage[i][j][1] = (GLubyte) ;checkImage[i][j][2] = (GLubyte) ;checkImage[i][j][3] = (GLubyte) ;}}}void init(void){ glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);glEnable(GL_DEPTH_TEST);makeCheckImage();// 生成一个纹理对象glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);// 载入纹理glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);// 初始化粒子for (loop=0; loop<MAX_PARTICLES; loop&#;&#;){particle[loop].active = true;particle[loop].life = 1.0f;particle[loop].fade=float(rand()%)/.0f&#;0.f;particle[loop].r=colors[loop*(/MAX_PARTICLES)][0];particle[loop].g=colors[loop*(/MAX_PARTICLES)][1];particle[loop].b=colors[loop*(/MAX_PARTICLES)][2];particle[loop].xi=float((rand()%)-.0f)*.0f;particle[loop].yi=float((rand()%)-.0f)*.0f;particle[loop].zi=float((rand()%)-.0f)*.0f;particle[loop].xg=0.0f;particle[loop].yg=-0.8f;particle[loop].zg=0.0f;// 粒子发射器位置particle[loop].y=emmiterY;particle[loop].x = float(RANDX);particle[loop].z = float(RANDZ);}}// openGL 主循环绘制函数void DrawGLScene(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt( x, 1.0f, z,x&#;lx, 1.0f, z&#;lz,0.0f, 1.0f, 0.0f);// 画地面// Draw groundglColor3f(0.9f, 0.9f, 0.9f);glBegin(GL_QUADS);glVertex3f(-.0f, 0.0f, -.0f);glVertex3f(-.0f, 0.0f, .0f);glVertex3f( .0f, 0.0f, .0f);glVertex3f( .0f, 0.0f, -.0f);glEnd();glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName); // 遍历所有的粒子,让粒子随着时间的变化而移动for (loop=0;loop<MAX_PARTICLES;loop&#;&#;){if (particle[loop].active){float x=particle[loop].x;float y=particle[loop].y;float z=particle[loop].z&#;zoom;glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life);// 带有纹理的粒子系统/* glBegin(GL_TRIANGLE_STRIP);glTexCoord2d(1,1); glVertex3f(x&#;0.5f,y&#;0.5f,z); glTexCoord2d(0,1); glVertex3f(x-0.5f,y&#;0.5f,z);glTexCoord2d(1,0); glVertex3f(x&#;0.5f,y-0.5f,z);glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);glEnd()*/;// Draw HeadglPushMatrix();glTranslatef(x&#;0.5f,y&#;0.5f,z);glutSolidSphere(0.f,,);glPopMatrix();// 粒子位置变化particle[loop].x&#;=particle[loop].xi/(slowdown*);particle[loop].y&#;=particle[loop].yi/(slowdown*);particle[loop].z&#;=particle[loop].zi/(slowdown*);// 粒子速度的变化particle[loop].xi&#;=particle[loop].xg;particle[loop].yi&#;=particle[loop].yg;particle[loop].zi&#;=particle[loop].zg;// 粒子生命的变化particle[loop].life-=particle[loop].fade;// 如果粒子生命结束,将生命结束的粒子从新移动到发射位置if (particle[loop].life<0.0f){particle[loop].life=1.0f;particle[loop].fade=float(rand()%)/.0f&#;0.f;// 将粒子从新放回粒子发射器位置particle[loop].y=emmiterY;particle[loop].x = float(RANDX);particle[loop].z = float(RANDZ);particle[loop].xi=xSpeed&#;float((rand()%)-.0f);particle[loop].yi=ySpeed&#;float((rand()%)-.0f);particle[loop].zi=float((rand()%)-.0f);particle[loop].r=colors[col][0];particle[loop].g=colors[col][1];particle[loop].b=colors[col][2];}}}glFlush();glDisable(GL_TEXTURE_2D);}// 处理openGL放大缩小之后的视点矩阵的变化void reshape(int w, int h){glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(.0, (GLfloat) w/(GLfloat) h, 1.0, .0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, -3.6);}// 处理键盘事件void keyboard (unsigned char key, int x, int y){switch (key) {case :exit(0);break;default:break;}}// 键盘按钮控制相机的移动void MMprocessSpecialKeys(int key, int xx, int yy) {float fraction = 0.1f;switch (key) {//只是改变了视点坐标向量,没有移动相机case GLUT_KEY_LEFT : angle -= 0.f;lx = sin(angle);lz = -cos(angle);break;//只是改变了视点坐标向量,没有移动相机case GLUT_KEY_RIGHT :angle &#;= 0.f;lx = sin(angle);lz = -cos(angle);break;// 没有改变视点,改变了相机的位置case GLUT_KEY_UP :x &#;= lx * fraction;z &#;= lz * fraction;break;// 没有改变视点,改变了相机的位置case GLUT_KEY_DOWN :x -= lx * fraction;z -= lz * fraction;break;}}int main(int argc, char** argv){// opengl 初始化的代码glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(, );glutInitWindowPosition(, );glutCreateWindow("穆洪:简单粒子系统");// 粒子系统初始化工作init();glutDisplayFunc(DrawGLScene);glutIdleFunc(DrawGLScene);// 处理部分特殊按键glutSpecialFunc(MMprocessSpecialKeys);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);// openGL主循环glutMainLoop();return 0; }

windows visual studio openGL开发环境配置 1.到openGL官方网站去下载openGL的开发包,目录如下2.打开visualstudio创建win控制台程序3.打开项目的属性4.配置项目动态库路径5.配置openGL的lib的目录(其

Android OpenGL 学习笔记 --开始篇 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。

OpenGL天空地形,场景漫游 Camera.hcamera.cppCBMPLoader.hCBMPLoader.cppFont.hFont.cppGLFrame.hGLFrame.cppGLWindow.hGLWindow.cppSkyAndTerrain.hSkyAndTerrain.cppSkyBox.hSkyBox.cppstdafx.hstdafx.cppTerrain.hTerrain.cppVector.hVect

标签: windows visual studio 基于openGL的粒子系统设计

本文链接地址:https://www.jiuchutong.com/biancheng/373148.html 转载请保留说明!

上一篇:OpenGL中的颜色混合功能(一)(opengl颜色代码表)

下一篇:windows visual studio openGL开发环境配置

  • 中型企业的标准是什么 划分标准
  • 税局退个税手续费税率
  • 小规模纳税人月收入多少免征增值税
  • 企业所得税和预提所得税
  • 无形资产的税费计入
  • 财政拨款结余明细科目编码
  • 火车票进项抵扣怎么勾选
  • 小微企业减免所得税额是怎么算出来的
  • 天猫费率是什么
  • 环境评估费应计入什么科目
  • 如何设置处理器个数如何设置显示器超频
  • 商业保理公司票据贴现账务处理
  • 会计差错更正业务处理怎么操作?
  • 行政事业单位拨入经费
  • 长期挂账应付款的审计
  • 长期股权投资范围比例
  • 一般销售商品业务
  • 工程公司安装中央空调能按混合销售计算增值税么?
  • 车辆购置税入什么科目?
  • 企业重组有什么好处
  • 新个税过了申报期怎么办
  • 电子公章盖上去怎么文字看不到了
  • 小贷公司贷款的流程是什么
  • 个税按工资薪金未按时申报的处罚规定
  • 财务报表教育费附加包含地方教育费附加吗
  • 其他有形动产租赁服务
  • 无法查明原因现金盘盈计入什么科目
  • 企业收到利息收入开发票吗
  • 如何做预估成本
  • 在建工程的二级明细的讲解
  • 提供给生产工人的住房的租赁费用应计入
  • linux日期格式
  • win7系统怎么重装win10系统
  • 对公账户信息补录
  • 简易计税办法和一般计税办法
  • gain_trickler_3202.exe 进程查询 gain_trickler_3202进程是什么文件
  • 工业企业应付会计工作内容
  • 发票章需要注销吗
  • timit数据集
  • 3d点云处理算法
  • phpcms怎么样
  • 律师事务所要交残保金吗
  • 已经申报过增值税,清卡时显示未申报什么原因
  • SQL中print、sp_helptext的限制与扩展
  • 在计算应纳税所得额时,纳税人因自然灾害
  • sql2005附加数据库出错
  • sqlserver数据库事物日志已满
  • 购买货物收到发票怎么做账小规模
  • 企业所得税季初和季末怎么算
  • 小规模纳税人的条件
  • 销售退回跨年度的会计分录
  • 费用本期发生额怎么算
  • 销项税票怎么开
  • 工程施工借款如何做会计分录
  • 通过T-SQL语句实现数据库备份与还原的代码
  • win10上如何安装hd4850驱动
  • 注册表删除win7自带游戏
  • safari 快捷键
  • macos手势
  • linuxwindows差别
  • win7系统为什么玩不了游戏
  • perl读取文件内容逐行处理
  • a*算法的优缺点
  • 获取jquery对象
  • js的document.getelembyid
  • jqueryanimate动画
  • nodejs连接redis
  • shell操作
  • unity2d ui
  • jq点击图片让图片进行切换
  • jquery.validate 自定义验证方法及validate相关参数
  • jquery属性操作
  • 鼠标瞬间移动
  • 安卓打造世界中文全dlc
  • 详解javascript事件冒泡
  • javascript基础
  • js入门基础教程
  • 内蒙古税务局电子发票查询
  • 装修时候需要交什么费
  • 代理记账公司自查自纠情况报告范文
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设