特效之火

Vector Colore(float col) // Calculate the color for the fire effect
{
 int ki;
 Vector kf;

 ki=(int)(col*256);
 if(ki<64)
 {
  kf.x=(float)ki/2;
  kf.y=(float)ki/4;
  kf.z=0;
 }
 else
 {
  if(ki<128)
  {
   kf.x=(float)ki/1.5;
   kf.y=(float)ki/2;
   kf.z=0;
  }
  else
  {
   if(ki<192)
   {
    kf.x=(float)ki;
    kf.y=(float)ki;
    kf.z=(float)ki/2;
   }
   else
   {
    kf.x=(float)ki;
    kf.y=(float)ki;
    kf.z=(float)ki;
   }
  }
 }

 return kf;

}

 

void Fire(void) // Fire effect for the presentation
{
 int x,xd,y,z;
 float ka;

 xd=2+rand()%(BUFAX-62);
 for(x=0;x<60;x++)
 {
  if(rand()%2!=1)
   bufB[xd+x][2]=(float)(var.fire+rand()%64)/256;
 }

//这个效果的关键是色彩的设定,也就是glColor3f()调用的数值,在图形的低端设置颜色值通过加权平均法,逐渐增加图形上端的颜

//色值,图形上端的颜色将逐渐减弱。

 for(y=BUFAZ-2;y>1;y--)
 {
  for(x=1;x<BUFAX-1;x++)
  {
   ka=bufB[x][y];
   ka+=bufB[x+1][y-1];
   ka+=bufB[x-1][y-1];
   ka+=bufB[x][y-1];
   ka=ka/4-(float)1.5/256;

   if(ka<0)
    ka=0;

   bufB[x][y]=ka;
  }
 }
}

 

 

 

void Presentazione(void)
{
 int x,z;
 float fx,fz;
 float a,b,c,d,t;
 Vector av,bv,cv,dv;

 

 Fire(); // Fire effect

 

 fx=(float)1/BUFAX; // For the texture coordinates
 fz=(float)1/BUFAZ;

 // Draws the fire
 for(z=0;z<BUFAZ-1;z++) 
 {
  for(x=0;x<BUFAX-1;x++)
  {
   t=bufB[x][z];
   av=Colore(t);
   t=bufB[x+1][z];
   bv=Colore(t);
   t=bufB[x+1][z+1];
   cv=Colore(t);
   t=bufB[x][z+1];
   dv=Colore(t);
   glBegin(GL_QUADS);
   glColor3f(av.x,av.y,av.z);
   glVertex3f(bufA[x][z].x,bufA[x][z].y,var.ky*bufB[x][z]);
   glColor3f(bv.x,bv.y,bv.z);
   glVertex3f(bufA[x+1][z].x,bufA[x+1][z].y,var.ky*bufB[x+1][z]);
   glColor3f(cv.x,cv.y,cv.z);
   glVertex3f(bufA[x+1][z+1].x,bufA[x+1][z+1].y,var.ky*bufB[x+1][z+1]);
   glColor3f(dv.x,dv.y,dv.z);
   glVertex3f(bufA[x][z+1].x,bufA[x][z+1].y,var.ky*bufB[x][z+1]);
   glEnd();
  }
 }
 glDisable(GL_TEXTURE_2D);

 
  var.fire--;
  if(var.fire==0)
  {
   var.fire=1;
  }
 
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值