zoukankan      html  css  js  c++  java
  • OpenGL小试牛刀第二季(粒子模拟)

    效果截图:粒子模拟
    图片
    代码展示:
    #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;
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/zzkgis/p/3742243.html
Copyright © 2011-2022 走看看