位置: 编程技术 - 正文

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

  • 财务软件费用可以抵税吗
  • 运费增值税税率有5吗
  • 汇算清缴需要传什么资料
  • 货物或应税劳务服务名称怎么填
  • 公司支付宝收款二维码怎么弄
  • 分公司可以独立承担法律责任吗
  • 发票遗失如何入账
  • 每月长摊金额如何分摊
  • 员工意外险费用
  • 小规模纳税人增值税申报表怎么填
  • 收到0税率发票是否可以给对方开6税率发票
  • 转账支票支付购货款填制什么凭证
  • 办理外汇账户开户手续
  • 小规模没有进项可以开发票吗
  • 支付一年房租计入什么科目
  • 来料加工账务处理办法
  • 长期待摊费用摊出来钱去哪里了
  • 字节跳动属于什么类型的企业
  • 已抵扣进项税额的购进货物或者应税劳务
  • 劳务公司注销了,未出的款怎么走账
  • 成品油消费税征税
  • 养牛场增值税的税率是多?
  • 无票费用如何做凭证分录
  • 公司的差旅费
  • 小微企业免税销售额一栏怎么填
  • 增值税发票压线能用吗
  • 分公司利润如何分红
  • 企业劳务外包取费的标准以及依据是什么?
  • 小规模纳税人减按1%如何填报申报表
  • 设备租赁公司怎么复制赚钱
  • php怎么把图片存入mysql
  • 记账凭证的摘要是什么意思
  • PHP:session_name()的用法_Session函数
  • 税收返还的账务处理
  • 制造业成本核算明细表
  • uniapp webgl
  • 旅游企业税务筹划
  • 残保金政策建议
  • vue-cli4创建项目
  • 如何用php操作mysql
  • 年度报表资产总额平均值怎么算
  • 企业网银证书年费是什么
  • 代扣代缴个人所得税账务处理
  • 开具电费发票如何入账
  • php sleep()
  • mysql语句like用法
  • SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息
  • 什么是代缴代扣
  • 财务报表信息的分类
  • 销售清单需要盖什么章子
  • 电汇和票汇
  • 住宿发票丢失
  • 留存收益转增资本公积
  • 管家婆进销存的凭证如何体现?
  • 两个公司的出纳怎么分账
  • 社保滞纳金可以免除吗
  • 出口退税账务处理
  • 销项税额和转出未交增值税余额怎么结转
  • 存货跌价准备的计算
  • 认证抵扣发票
  • 销售回款率怎么计算,麻烦知道的告诉我,11
  • 不能抵扣的进项税怎么做账务处理
  • 自制原始凭证的填制
  • sql删除多条记录
  • bios1962错误
  • quicklook预览word
  • mac插hdmi没画面
  • linux创建个人主页
  • linux系统怎么安装
  • WIN10任务栏时间不动
  • linux中crontab的用法
  • Python爬取qq music中的音乐url及批量下载
  • ecmascript6 官方文档
  • angular ngshow
  • python 线程教程
  • python的字符
  • 安卓手机管家推荐
  • Android 自定义view
  • 税务局怎么增加购票员
  • 宾馆如何申请税务发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设