位置: 编程技术 - 正文

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开发环境配置

  • 报完增值税就要清卡吗
  • 个体户一年能开多少普票
  • 企业合并吸收税务处理
  • 税屋网官网房屋
  • 资产处理损益属于什么科目借贷方向
  • 免抵退税的计算数据
  • 小规模纳税人季报还是月报?
  • 销售退回所得税差异怎么处理
  • 收到国家退税
  • 资产拍卖税费谁承担
  • 金融保险定义
  • 企业净资产指的是什么?
  • 公司购买汽车的购置税怎么做账
  • 报销抵冲银行日记帐要怎么入帐?
  • 房地产企业的样板房,装修款如何缴纳增值税
  • 城建税有哪些征税项目
  • 退付手续费怎么操作
  • 出售提完折旧的固定资产怎么记账
  • 企业废业实收资产怎么算
  • php mktime函数
  • PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
  • 冲销上月多记收入
  • 部shu
  • 为什么把收入进行舞弊假定
  • 工程结算需要哪些施工方案
  • 小孩不爱吃蔬菜怎么办?
  • 莫纳皮拉
  • 代扣代缴企业所得税账务处理
  • php文件上传后只显示了路径怎么办啊
  • Centos6.5和Centos7 php环境搭建方法
  • php流程图
  • 残疾人保障金工资总额包括年终奖吗
  • promise基本使用
  • 企业所得税营业收入包括什么
  • 公司注册资金表格模板
  • 工商登记备案在哪查
  • 公司食堂吃饭没钱怎么办
  • 如何用ps做半圆
  • 使用增值税发票违法吗
  • 佣金的会计如何计算
  • 数据库参数错误
  • 实物投资入股
  • 接受捐赠如何进项
  • 建筑公司算不算企业
  • 零申报是怎么回事
  • 民办幼儿园账务月末结转
  • 去年多计提工资今年怎么进行损益调整
  • 复利现值系数表系数表
  • 预付款项属于什么会计要素
  • 单位买的职工社保自己可以去社保局领卡吗
  • 期末留抵的税额怎么做分录
  • 福利费可以计入销售费用吗
  • 车辆商业险和交强险不在同一日期
  • 支付水电费会计等式
  • 人力资源劳务费计入什么科目
  • 什么叫发票分割单
  • 怎么开劳务派遣工作证明
  • 哪些发票必须注销
  • 应收账款属于流动负债项目吗
  • 商品流通的企业
  • mysql导入导出sql文件
  • mysqldump备份数据库不完整
  • win7系统怎么把字体调大
  • Windows 7(x64)下安装Ubuntu12.4的方法
  • 远程控制安全
  • windows7开始菜单设置在哪里
  • win7系统存储在哪
  • win8查看已连接的wifi密码
  • win7temp文件夹在哪
  • win 7笔记本连接投影仪
  • 百度关键词设置
  • unityui插件
  • nodejs怎么启动服务
  • 基于JavaScript实现的可试化工具是
  • python单链表输出1到10
  • 湖南低保查询网上查询
  • 税费算管理费用还是财务费用
  • 莆田税务学校地址
  • 保险机构如何代收车船税
  • 广州代理记账公司地址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设