效果截图:粒子模拟

代码展示:
#include "Particle.h"
/** 构造函数 */
CParticle::CParticle()
{
 data = NULL;
 numparticle = 0;
 
}
/** 析构函数 */
CParticle::~CParticle()
{
 delete []data;
 data = NULL;
}
/** 创建一个包含num个元素的粒子数组 */
int CParticle::Create(long num)
{
 /** 删除粒子数组 */
 if (data) 
  delete []data;
 /** 创建数组 */
 if(data = new Particle[num])
 {
  memset(data,0,sizeof(Particle)*numparticle);
  numparticle = num;
  
  /** 返回粒子个数 */
  return numparticle;      
 }
 return 0;
}
 
/** 载入纹理 */
bool CParticle::LoadTextures()
{
 
 char* fileName[] = {"Data/wall.bmp","Data/flare.bmp" };
 
 for(int i=0; i<2; i++)
 {
  if(!texture[i].LoadBitmap(fileName[i]))
  {
   MessageBox(NULL,"载入纹理失败!","错误",MB_OK);
   exit(-1);
  }
  glGenTextures(1,&texture[i].ID);         
  
  /** 创建纹理对象 */
  glBindTexture(GL_TEXTURE_2D, texture[i].ID);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, texture[i].imageWidth,
      texture[i].imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
         texture[i].image);
 }
 return true;
  
}
/** 返回纹理ID */
unsigned int CParticle::GetTexture(int index)
{
 if(index == 0 || index == 1)
  
  return texture[index].ID; 
}
/** 设置和获取颜色Color的函数实现 */
int CParticle::SetColor(GLint r,GLint g,GLint b)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].r=r;
  data[index].g=g;
  data[index].b=b;
 }
 return TRUE;
}
int CParticle::SetColor(GLint index,GLint r,GLint g,GLint b)
{
 if(index>=0 && index<numparticle)
 {
  data[index].r=r;
  data[index].g=g;
  data[index].b=b;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetColor(GLint index,GLint &r,GLint &g,GLint &b)
{
 if(index>=0 && index<numparticle)
 {
  r=data[index].r;
  g=data[index].g;
  b=data[index].b;
  return TRUE;
 }
 return FALSE;
}
/** 设置和获取位置Position的函数实现 */
int CParticle::SetPosition(GLfloat x,GLfloat y,GLfloat z)
{
 for(int index=0;index<numparticle;++index)
 {
  data[index].x=x;
  data[index].y=y;
  data[index].z=z;
 }
 return TRUE;
}
int CParticle::SetPosition(GLint index,GLfloat x,GLfloat y,GLfloat z)
{
 if(index>=0 && index<numparticle)
 {
  data[index].x=x;
  data[index].y=y;
  data[index].z=z;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetPosition(GLint index,GLfloat &x,GLfloat &y,GLfloat &z)
{
 if(index>=0 && index<numparticle)
 {
  x=data[index].x;
  y=data[index].y;
  z=data[index].z;
  return TRUE;
 }
 return FALSE;
}
/** 设置和获取加速度Acceleration的函数实现 */
int CParticle::SetAcceleration(GLfloat ax,GLfloat ay,GLfloat az)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].ax=ax;
  data[index].ay=ay;
  data[index].az=az;
 }
 return TRUE;
}
int CParticle::SetAcceleration(GLint index,GLfloat ax,GLfloat ay,GLfloat az)
{
 if(index>=0 && index<numparticle)
 {
  data[index].ax=ax;
  data[index].ay=ay;
  data[index].az=az;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetAcceletation(GLint index,GLfloat &ax,GLfloat &ay,GLfloat &az)
{
 if(index>=0 && index<numparticle)
 {
  ax=data[index].ax;
  ay=data[index].ay;
  az=data[index].az;
  return TRUE;
 }
 return FALSE;
}
 
/** Velocity函数的实现 */
int CParticle::SetVelocity(GLfloat vx,GLfloat vy,GLfloat vz)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].vx=vx;
  data[index].vy=vy;
  data[index].vz=vz;
 }
 return TRUE;
}
int CParticle::SetVelocity(GLint index,GLfloat vx,GLfloat vy,GLfloat vz)
{
 if(index>=0 && index<numparticle)
 {
  data[index].vx=vx;
  data[index].vy=vy;
  data[index].vz=vz;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetVelocity(GLint index,GLfloat &vx,GLfloat &vy,GLfloat &vz)
{
 if(index>=0 && index<numparticle)
 {
  vx=data[index].vx;
  vy=data[index].vy;
  vz=data[index].vz;
  return TRUE;
 }
 return FALSE;
}
/** Size函数的实现 */
int CParticle::SetSize(GLfloat size)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].size=size;
 }
 return TRUE;
}
int CParticle::SetSize(GLint index,GLfloat size)
{
 if (index>=0 && index<numparticle)
 {
  data[index].size=size;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetSize(GLint index,GLfloat &size)
{
 if(index >= 0 && index < numparticle)
 {
  size=data[index].size;
  return TRUE;
 }
 return FALSE;
}
/** 消失速度Dec函数 */
int CParticle::SetDec(GLfloat dec)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].dec=dec;
 }
 return TRUE;
}
int CParticle::SetDec(GLint index,GLfloat dec)
{
 if(index >= 0 && index < numparticle)
 {
  data[index].dec=dec;
  return TRUE;
 }
 return FALSE;
}
int CParticle::GetDec(GLint index,GLfloat &dec)
{
 if(index >= 0 && index < numparticle)
 {
  dec=data[index].dec;
  return TRUE;
 }
 return FALSE;
}
/** 设置粒子的lifetime 属性 */
int CParticle::SetLifeTime(GLfloat lifetime)
{
 for (int index=0;index<numparticle;++index)
 {
  data[index].lifetime=lifetime;
 }
 return TRUE;
}
int CParticle::SetLifeTime(GLint index,GLfloat lifetime)
{
 if(index >= 0 && index < numparticle)
 {
  data[index].lifetime=lifetime;
  return TRUE;
 }
 return FALSE;
}
/** 获得粒子的lifetime属性 */
int CParticle::GetLifeTime(GLint index,GLfloat &lifetime)
{
 if(index >= 0 && index < numparticle)
 {
  lifetime=data[index].lifetime;
  return TRUE;
 }
 return FALSE;
}
/** 获取粒子的所有属性 */
int CParticle::GetAll(int index,GLint &r,GLint &g,GLint &b,         /**< 粒子的颜色 */
       GLfloat &x,GLfloat &y,GLfloat &z,  /**< 位置 */
       GLfloat &vx,GLfloat &vy,GLfloat &vz, /**< 速度 */
       GLfloat &ax,GLfloat &ay,GLfloat &az, /**< 加速度 */
       GLfloat &size,          /**< 大小 */
       GLfloat &lifetime,         /**< 生命时间 */
       GLfloat &dec             /**< 消失速度 */
       )
{
 if (index>=0 && index<numparticle)
 {
  r=data[index].r;
  g=data[index].g;
  b=data[index].b;
  x=data[index].x;
  y=data[index].y;
  z=data[index].z;
  vx=data[index].vx;
  vy=data[index].vy;
  vz=data[index].vz;
  ax=data[index].ax;
  ay=data[index].ay;
  az=data[index].az;
  lifetime=data[index].lifetime;
  size=data[index].size;
  dec=data[index].dec;
     return TRUE;
 }
 return FALSE;
}
/** 设置粒子的所有属性 */
int CParticle::SetAll(int index,GLint r,GLint g,GLint b,        /**< 粒子的颜色 */
       GLfloat x,GLfloat y,GLfloat z,  /**< 位置 */
       GLfloat vx,GLfloat vy,GLfloat vz, /**< 速度 */
       GLfloat ax,GLfloat ay,GLfloat az, /**< 加速度 */
       GLfloat size,      /**< 大小 */
       GLfloat lifetime,     /**< 生命时间 */
       GLfloat dec          /**< 消失速度 */
       )
{
 if(index>=0 && index<numparticle)
 {
  data[index].r=r;
  data[index].g=g;
  data[index].b=b;
  data[index].x=x;
  data[index].y=y;
  data[index].z=z;
  data[index].vx=vx;
  data[index].vy=vy;
  data[index].vz=vz;
  data[index].ax=ax;
  data[index].ay=ay;
  data[index].az=az;
  data[index].lifetime=lifetime;
  data[index].size=size;
  data[index].dec=dec;
  return TRUE;
 }
 return FALSE;

OpenGL小试牛刀第二季(粒子模拟)的更多相关文章

  1. OpenGL小试牛刀第一季

    效果截图:代码展示:using System;using System.Collections.Generic;using System.ComponentModel;using System.Dat ...

  2. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

  3. 《舌尖上的中国》第二季今日首播了,天猫食品也跟着首发,借力使力[bubuko.com]

    天猫旗下的天猫食品与央视CCTV-1栏目<舌尖上的中国>第二季(以下简称“舌尖2”)达成合作,天猫食品成为舌尖2独家合作平台,同步首发每期 节目中的食材和美食菜谱,舌尖2摄制组还将为同步上 ...

  4. 一起做RGB-D SLAM 第二季 (一)

    小萝卜:师兄!过年啦!是不是很无聊啊!普通人的生活就是赚钱花钱,实在是很没意思啊! 师兄:是啊…… 小萝卜:他们都不懂搞科研和码代码的乐趣呀! 师兄:可不是嘛…… 小萝卜:所以今年过年,我们再做一个S ...

  5. JAVA入门第二季(mooc-笔记)

    相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第二季&g ...

  6. Big Data 應用:第二季(4~6月)台湾地区Game APP 变动分布趋势图

    图表简介: 该示意图表示了台湾地区第二季内所有Game APP类别的分布情形,经由该图表我们可以快速的了解到在这三个月内,哪类型的APP是很稳定:抑或者哪类型的APP是非常不稳定的. 名词解释: 类别 ...

  7. 再造轮子之网易彩票-第二季(IOS 篇 by sixleaves)

    02-彩票项目第二季 2.封装SWPTabBar方式一 接着我们思考如何进行封装.前面已经将过了为什么要封装, 和封装达到的效果.这里我们主要有两种封装方式,分别是站在不同的角度上看待问题.虽然角度不 ...

  8. QQ聊天界面的布局和设计(IOS篇)-第二季

    QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...

  9. Eclipse相关集锦第二季

    Eclipse相关的问题第二季开始了,这些问题都是我平时遇到的,然后记录下来备忘,帮助到别人最好不过了. 1.Unable to execute dex: GC overhead limit exce ...

随机推荐

  1. switch()出现警告warning:enumeration value ‘xxx’ not handled in switch

    enumeration value ... not handled in switch 如果在switch中使用使用枚举类型,如:switch(枚举类型) 枚举类型的个数没有全部列出,就会报这个警告

  2. C#API接口调试工具

    自从去年软件界网站开发推崇前后端分离,我们公司也在进行转行行,从原先的前端架构,后端架构,数据库搭建一肩挑的模式也逐渐转型为前后端分离,大量招收前端开发人员,原来的人员也转型为专职的后端开发,这样的变 ...

  3. C++读取XML,tinyXml的使用

    前言: 最近在开发的过程中,有个需求是对xml进行格式转化,从一种格式转化到另外一种格式.因此,就需要读取xml进行处理.原本打算写成工具在linux下运行,不过后来考虑到和系统结合,最后也就使用了前 ...

  4. 根据xml文件自动生成xsd文件

    根据xml生成xsd文档 1. 找到vs自带的xsd.exe工具所在的文件夹位置: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 注意 ...

  5. hdu 5033 buiding(单调栈)

    hdu 5033 buiding(单调栈) 某年某月某天,马特去了一个小镇.这个小镇如此狭窄,以至于他可以把小镇当作一个枢纽.在镇上有一些摩天大楼,其中一栋位于xi,高度为hi.所有的摩天大楼位于不同 ...

  6. QQ 数(number.pas/c/cpp)——莫比乌斯函数

    题目 [问题描述] 企鹅国数学家 QQ 潜心研究数论,终于发现了一个简单的数论问题! 一个 QQ 数定义为一个拥有一个大于 $ 1 $ 的完全平方数为因子的数字,一个数字的 QQ 值定义为这个数是 Q ...

  7. [Algorithm]巧用多项式系数与进制的联系

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. SQL Server权限设置

    常用的几个系统表:(其实是View) sysdatabases,主数据库,服务器上的数据库 sysobjects,每个数据库,所有数据库对象 syscolumns,每个数据库,列 sysprocess ...

  9. 从零开始学Docker

    在写这篇博客之前,听说过Docker技术,但是一直没有主动去深入了解.用这篇博客来记录自己学习Docker的个人总结,会一直补充完善. 我这边先随便写,后期再做总结!! Docker官网: https ...

  10. 双系统安装Linux的步骤以及一些误区

    1.一次安装失败引发的思考 笔者安装双系统(Windows 7+ Ubuntu 16.01)时参考了如何安装win10和linux [ubuntu14]双系统这篇百度经验,却发现安装后并没有如期进入U ...