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);
}
这个程序一直没有搞明白,所以想请教大牛?我也类似的做了一个导弹的模型,用以上的方法来模拟尾焰,但是尾焰画出来只是一个四边形的东西,根本显示不了逼真的尾焰模型。
// 烟雾运动的数据初始化程序
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28