+ -
当前位置:首页 → 问答吧 → opengl高级编程与可视化系统开发中 有一个例子的意思 想请教大家

opengl高级编程与可视化系统开发中 有一个例子的意思 想请教大家

时间:2011-12-07

来源:互联网

这个例子是用粒子系统来模拟导弹的尾焰,其中的一部分程序如下所示:
// 烟雾运动的数据初始化程序
for(t=0;t<MAXSMOKEMISSILE;t++)
 {
  if(smoke_mis[t].active==false)
  {
  smoke_mis[t].x=var.xmis;
  smoke_mis[t].y=var.ymis;
  smoke_mis[t].z=var.zmis+3;
  smoke_mis[t].active=true;
  smoke_mis[t].anx=0;
  smoke_mis[t].any=0;
  smoke_mis[t].anz=0;
  smoke_mis[t].dim=(float)(rand()%100)/100;
  smoke_mis[t].ddim=(float)0.1;
  smoke_mis[t].r=1;
  smoke_mis[t].g=1;
  smoke_mis[t].b=1;
  smoke_mis[t].dx=(float)(rand()%100-rand()%100)/1000;
  smoke_mis[t].dy=(float)(rand()%100-rand()%100)/1000;
  smoke_mis[t].dz=-var.vmis/1.2;
  }
  else
  {
  smoke_mis[t].x+=smoke_mis[t].dx;
  smoke_mis[t].y+=smoke_mis[t].dy;
  smoke_mis[t].z+=smoke_mis[t].dz;
  smoke_mis[t].dx/=1.001;
  smoke_mis[t].dy/=1.001;
  smoke_mis[t].dz/=1.001;
  smoke_mis[t].dim+=smoke_mis[t].ddim;
  if(smoke_mis[t].dim>1.5)
  smoke_mis[t].active=false;
  smoke_mis[t].r-=0.01;
  smoke_mis[t].g-=0.01;
  smoke_mis[t].b-=0.01;
  if(smoke_mis[t].r==0)
  smoke_mis[t].active=false;
  // 绘制尾部烟雾
  if(smoke_mis[t].active==true)
  Luce(smoke_mis[t].x,smoke_mis[t].y,smoke_mis[t].z,smoke_mis[t].dim,smoke_mis[t].r,smoke_mis[t].g/2,smoke_mis[t].b/3,var.xcam,var.ycam,var.zcam,3);
 

//这是尾焰显示的程序,是用四边形纹理贴图模拟的
 void CMissileTestView:uce(double x, double y, double z,double dimensione,float r,float g,float b,float iox,float ioy,float ioz,int Tex)
 {
 Vector Position;
 Vector MyPosition;
 Position.x = x;
 Position.y = y;
 Position.z = z;
 MyPosition.x=iox;
 MyPosition.y=ioy;
 MyPosition.z=ioz;
 Vector sight = VectorDiff(MyPosition, Position);
 Vector cz;//看来与这个线性数组设置无关
cz.x = 1;
 cz.y = 2;
 cz.z = 1;
 Vector cross1 = VectorMultiply( sight, cz );
 Vector cross2 = VectorMultiply( sight, cross1 );
 cross1 = VectorNormalize(cross1);
 cross2 = VectorNormalize(cross2);
 cross1 = VectorScalarMultiply(cross1, dimensione);
 cross2 = VectorScalarMultiply(cross2, dimensione);
 glColor3f(r,g,b);
 glEnable(GL_TEXTURE_2D);
 glEnable (GL_BLEND);
 glBlendFunc( (1,1,1,1), (1,1,1,1));
 glDepthMask (GL_FALSE);
 glBindTexture( GL_TEXTURE_2D, texture[Tex] );
 glBegin(GL_QUADS);
  glTexCoord2d( 0.0, 0.0 );
  glVertex3d( Position.x + cross1.x, Position.y + cross1.y, Position.z + cross1.z);
  glTexCoord2d( 1.0, 0.0 );
  glVertex3d( Position.x - cross2.x, Position.y - cross2.y, Position.z - cross2.z);
  glTexCoord2d( 1.0, 1.0 );
  glVertex3d( Position.x - cross1.x, Position.y - cross1.y, Position.z - cross1.z);
  glTexCoord2d( 0.0, 1.0 );
  glVertex3d( Position.x + cross2.x, Position.y + cross2.y, Position.z + cross2.z);
 glEnd();
 glDisable(GL_TEXTURE_2D);
 glDisable (GL_BLEND);
 glDepthMask (GL_TRUE);
 }
 
这个程序一直没有搞明白,所以想请教大牛?我也类似的做了一个导弹的模型,用以上的方法来模拟尾焰,但是尾焰画出来只是一个四边形的东西,根本显示不了逼真的尾焰模型。

作者: haojj123   发布时间: 2011-12-07

anybodys???

作者: haojj123   发布时间: 2011-12-07