位置: 编程技术 - 正文

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

  • 印花税核定征收文件
  • 出差补贴要不要发票
  • 出口退税中的免抵税额可以认为是交的税吗
  • 无票收入是否要交税
  • 对公账户是不是实时到账
  • 发票红冲重新开
  • 购买工业用地税费
  • 成本会计实训要求
  • 开具红字增值税专用发票的条件
  • 什么叫应纳税额什么与什么的比率叫做税率
  • 内部企业借款利息在建工程资本化
  • 结转安装费用的会计分录
  • 借长期借款贷在建工程
  • 企业销售货物的税率是多少
  • 融资租赁与经营租赁相比具有的优势
  • 营改增后附加税费入应交税费还是营业税金及附加
  • 企业所得税申报表
  • 商品促销有关问题
  • 找私人买东西不发货算诈骗吗
  • 工程施工科目月末如何结转
  • win10桌面窗口管理器gpu占用高
  • 如何安装react
  • mac废纸篓立即删除和清倒
  • 外购固定资产入账
  • Chat GPT实用案例——VUE+Chat GPT实现聊天功能教程
  • element-ui表格
  • 对个别报表中处置收益的归属期间进行调整
  • 政府会计制度固定资产折旧方法
  • 个人独资企业法律责任
  • rep p
  • Element UI - v-infinite-scroll无限滚动组件
  • php命令大全
  • 公司租赁车辆的保险费可以扣除
  • 预收账款发货
  • 免增值税项目可以抵扣吗
  • 所得税申报表是什么
  • SQL Server 2016 CTP2.2安装配置方法图文教程
  • SQLite Delete详解及实例代码
  • 党建工作经费1%
  • 购销合同印花税税率
  • 小规模可以不用软件做账吗
  • 确认应付职工薪酬怎么算
  • 其他应收款科目代码
  • 政府扶持资金使用要求
  • 购买防伪税控设备
  • 增值税当月缴纳还是次月缴纳
  • 股权转让需要哪些手续及流程
  • 管理费用现金流量附表指定
  • 汇算清缴缴纳的所得税怎么做账
  • 本月没有销售怎么做账
  • 抵扣认证的发票怎么冲红
  • 国际货运代理公司税率为啥是免税
  • 递延收益确认的递延所得税资产有期限吗
  • 什么是定额发票图片
  • 新成立公司年初余额
  • 深入分析换一种说法
  • Windows下MySQL5.7.18安装教程
  • windows预览版
  • UNIX系统中文件的索引表结构
  • ubuntu的命令行快捷键
  • ubuntu20.04怎么用
  • win7装vmware
  • linux常用命令修改
  • 不知道,不知道
  • mac视频预览图不显示
  • 电脑windows8怎么样
  • WIN7系统电脑对话框跟鼠标走怎样设置
  • linux 使用
  • win7系统删除ie浏览器
  • 贝塞尔曲线pr怎么用
  • 感恩节0
  • python编写人工智能
  • Android GridView属性集合
  • 风力发电,光伏发电还有哪些
  • 税务系统干部选拔任用工作树立导向
  • 福建省地方税务局杨静
  • 软件和集成电路企业税收优惠
  • 贵州网上税务大厅官网
  • 分红太多
  • 化妆品的消费税税率为15%的比例税率
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设