位置: 编程技术 - 正文

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

  • 印花税核定征收文件
  • 一般纳税人购进货物用于免征增值税项目
  • 用友会计报表
  • 注册公司认缴出资方式怎么选
  • 政府补助需要交哪些税
  • 红字发票信息表编号在哪里看
  • 偶然所得计税依据 包不包含增值税
  • 员工工伤保险报销走什么科目
  • 关联企业借款利息税前扣除
  • 转账支票怎么进账到个人账户
  • 快递公司税收优惠
  • 个税申报系统操作流程app
  • 电子发票怎么打成A4纸一半
  • 成本是否有含税金额
  • 税收征收管理权是什么
  • 苹果电脑重新安装系统磁盘锁了怎么办
  • 斐讯路由器地址在哪里看
  • 股权和投票权的关系是什么关系
  • 腾讯云centos5.8
  • 兼职人员工资如何扣税
  • launcheflc.exe什么意思
  • php 调用函数
  • Linux下使用quota命令管理磁盘空间的实例教程
  • 深度学习之GPU显存与利用率 浅析小结
  • 混凝土简易计税能抵扣么
  • 分页的实现
  • 一文速学-XGBoost模型算法原理以及实现+Python项目实战
  • chkconfig命令参数
  • 视图机制
  • 残保金是应交税金吗
  • 城建税退回与不退税区别
  • 税控机清单
  • 应收账款计提坏账准备方法
  • 个人收入如何开出发票
  • phpcms v9 getshell
  • 织梦cms怎么样
  • pythonjam怎么用
  • 股权分配和利润的关系
  • 财务报表没申报怎么操作呢
  • 计提资产减值准备时,借记的科目是
  • 什么叫总分类账簿
  • 存货成本主要包括
  • 核定征收怎么收
  • 支付技术研究开发费
  • 发票已到货未到会计分录
  • 买一赠一销售额的确定
  • 业务招待费汇算清缴比例
  • 资产负债表中应付职工薪酬是负数
  • 会计凭证装订的步骤
  • haproxy教程
  • sql多行合并成一行 oracle
  • 简述mysql的优势
  • bios怎么恢复出厂设置有什么后果?
  • win7系统命令激活
  • win10显示请勿关闭电脑
  • 序列号错误或不完整
  • freebsd 配置ip
  • bios设置从光驱启动优先,可是启动不了
  • windows有哪些好用的软件
  • win8有几种版本
  • win10专业装机版
  • mac怎么多开
  • win8怎么禁止弹窗
  • xshell远程桌面
  • rhel7提供的5种基本安装方式是
  • win8桌面一直在闪
  • win8.1技巧
  • win10的播放设置在哪
  • cocos2dx-3.0(23) ScrollView 缩放 及 touch新用法
  • Unity3D游戏开发引擎
  • js canvas绘制图片
  • python字符串常用的五种方法
  • js判断时间差
  • js的异步解决方案有哪些
  • 深入浅出html pdf中文版
  • 发票在税务系统查不到对方要怎么做
  • 电子税务里面怎么作废发票
  • 为什么要去山西
  • 企业年度申报怎么修改
  • 放管服中的服的深层含义
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设