📄 missiletestview.cpp
字号:
gluLookAt(var.xcam,var.ycam,var.zcam,0,4,0,0.0f,1.0f,0.0f);
break;
case CAM_G:
var.xcam-=0.1;
var.ycam+=0.2;
var.zcam--;
gluLookAt(var.xcam,var.ycam,var.zcam,var.xmis,var.ymis,var.zmis,0.0f,1.0f,0.0f);
break;
case CAM_H:
var.xcam=-4;
var.ycam=-2;
var.zcam=200;
gluLookAt(var.xcam,var.ycam,var.zcam,var.xmis,var.ymis,var.zmis,0.0f,1.0f,0.0f);
break;
}
}
void CMissileTestView::CalFragment(void)
{
int t,k=false;
for(t=0;t<MAXFRAGMENT;t++)
{
if(fragment[t].active==true)
{
k=true;
fragment[t].anx+=4;
fragment[t].anz+=3;
fragment[t].x+=fragment[t].dx;
fragment[t].y+=fragment[t].dy;
fragment[t].z+=fragment[t].dz;
if(fragment[t].y<-4)
{
fragment[t].dy/=2;
fragment[t].dy=-fragment[t].dy;
fragment[t].y+=fragment[t].dy;
fragment[t].ddim--;
if(fragment[t].ddim<=0)
fragment[t].active=false;
}
fragment[t].dy-=0.01;
}
}
if(k==false)
var.fine=true;
}
void CMissileTestView::DrawFragment(void)
{
int t;
glColor3f(1,1,1);
for(t=0;t<MAXFRAGMENT;t++)
{
if(fragment[t].active==true)
{
glPushMatrix();
glTranslatef(fragment[t].x,fragment[t].y,fragment[t].z);
glRotatef(fragment[t].anx,1,0,0);
glRotatef(fragment[t].anz,0,0,1);
glBegin(GL_TRIANGLES);
glVertex3f(0,0,0.1f);
glVertex3f(0.1f,0,-0.1f);
glVertex3f(-0.1f,0,-0.1f);
glEnd();
glPopMatrix();
}
}
}
void CMissileTestView::CalTarget(void)
{
int t,x,z;
float y,dist;
for(t=0;t<5;t++)
{
for(z=0;z<DIMZ;z++)
{
for(x=0;x<DIMX;x++)
{
y=target_ex[x][z][t].y;
dist=target_ex[x][z][t].dist;
switch(t)
{
case 0:
y=-dist/2;
break;
case 1:
y=-dist/2;
break;
case 2:
y=-dist/2;
break;
case 3:
y=dist/2;
break;
case 4:
y=dist/2;
break;
}
y=y+dist*var.potenza;
if( x==0 || x==DIMX-1 || z==0 || z==DIMZ-1 )
y=0;
target[x][z][t].y=y;
}
}
}
}
void CMissileTestView::DrawExplosion(void)
{
int t;
for(t=0;t<var.nexplosion;t++)
{
if(smoke_exp[t].active==true)
{
smoke_exp[t].x+=smoke_exp[t].dx;
smoke_exp[t].y+=smoke_exp[t].dy;
smoke_exp[t].z+=smoke_exp[t].dz;
smoke_exp[t].dx/=1.001;
smoke_exp[t].dy+=0.002;
smoke_exp[t].dz/=1.001;
smoke_exp[t].dim+=smoke_exp[t].ddim;
if(smoke_exp[t].dim>10)
smoke_exp[t].active=false;
smoke_exp[t].r-=0.01;
smoke_exp[t].g-=0.01;
smoke_exp[t].b-=0.01;
if(smoke_exp[t].r==0)
smoke_exp[t].active=false;
Luce(smoke_exp[t].x,smoke_exp[t].y,smoke_exp[t].z,smoke_exp[t].dim,smoke_exp[t].r,smoke_exp[t].g/2,smoke_exp[t].b/3,var.xcam,var.ycam,var.zcam,3);
}
}
}
void CMissileTestView::DrawMoveSmoke(void)
{
int t;
// 烟雾运动
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)
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::DrawMissile(void)
{
glPushMatrix();
glEnable(GL_LIGHTING);
glTranslatef(var.xmis,var.ymis,var.zmis);
glRotatef(var.amis,1,0,0);
glRotatef(180,0,1,0);
pModel->draw();
glDisable(GL_LIGHTING);
glPopMatrix();
var.amis-=var.damis;
if(var.amis<0)
var.amis=0;
}
void CMissileTestView::DrawLauncher(void)
{
glColor3f(0.6f,0.3f,0.1f);
glEnable(GL_LIGHTING);
glPushMatrix();
glTranslatef(0,2,988);
gluCylinder(quadratic,1.4f,1.4f,5,8,8);
glDisable(GL_LIGHTING);
glPopMatrix();
glColor3f(0.6f,0.3f,0.1f);
glPushMatrix();
glTranslatef(0,0,993);
glBegin(GL_QUADS);
glVertex3f(-2,4,0);
glVertex3f(2,4,0);
glVertex3f(2,-8,0);
glVertex3f(-2,-8,0);
glEnd();
glPopMatrix();
}
void CMissileTestView::DrawTerrain(void)
{
float z;
glColor3f(0.8f,1,0.8f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-1000,-4,-100);
glTexCoord2f(1,0); glVertex3f(-10,-4,-100);
glTexCoord2f(1,1); glVertex3f(-10,-4,1200);
glTexCoord2f(0,1); glVertex3f(-1000,-4,1200);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(1200,-4,-100);
glTexCoord2f(1,0); glVertex3f(10,-4,-100);
glTexCoord2f(1,1); glVertex3f(10,-4,1200);
glTexCoord2f(0,1); glVertex3f(1200,-4,1200);
glEnd();
glColor3f(1,1,1);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-1000,-8,-100);
glTexCoord2f(1,0); glVertex3f(1000,-8,-100);
glTexCoord2f(1,1); glVertex3f(1000,100,-200);
glTexCoord2f(0,1); glVertex3f(-1000,100,-200);
glEnd();
for(z=1200;z>-100;z-=25)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(1,0); glVertex3f(-10,-4,z);
glTexCoord2f(1,1); glVertex3f(-9,-8,z);
glTexCoord2f(0,1); glVertex3f(-9,-8,z-25);
glTexCoord2f(0,0); glVertex3f(-10,-4,z-25);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(1,0); glVertex3f(10,-4,z);
glTexCoord2f(1,1); glVertex3f(9,-8,z);
glTexCoord2f(0,1); glVertex3f(9,-8,z-25);
glTexCoord2f(0,0); glVertex3f(10,-4,z-25);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(-9,-8,z);
glTexCoord2f(1,0); glVertex3f(9,-8,z);
glTexCoord2f(1,1); glVertex3f(9,-8,z-25);
glTexCoord2f(0,1); glVertex3f(-9,-8,z-25);
glEnd();
glDisable(GL_TEXTURE_2D);
if(z>0)
{
glBegin(GL_QUADS);
glVertex3f(-0.5f,-7.9f,z);
glVertex3f(0.5f,-7.9f,z);
glVertex3f(0.5f,-7.9f,z-15);
glVertex3f(-0.5f,-7.9f,z-15);
glEnd();
}
}
}
void CMissileTestView::DrawTarget(void)
{
int x,z;
float fx,fz;
glEnable(GL_TEXTURE_2D);
if(var.fexplosion==false)
glBindTexture(GL_TEXTURE_2D, texture[0]);
else
glBindTexture(GL_TEXTURE_2D, texture[4]);
// 平面 1
glColor3f(1,1,1);
glPushMatrix();
glRotatef(90,1,0,0);
fx=(float)1/DIMX;
fz=(float)1/DIMZ;
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2f(fx*x,fz*z); glVertex3f(target[x][z][0].x,target[x][z][0].y,target[x][z][0].z);
glTexCoord2f(fx*x+fx,fz*z); glVertex3f(target[x+1][z][0].x,target[x+1][z][0].y,target[x+1][z][0].z);
glTexCoord2f(fx*x+fx,fz*z+fz); glVertex3f(target[x+1][z+1][0].x,target[x+1][z+1][0].y,target[x+1][z+1][0].z);
glTexCoord2f(fx*x,fz*z+fz); glVertex3f(target[x][z+1][0].x,target[x][z+1][0].y,target[x][z+1][0].z);
glEnd();
}
}
glPopMatrix();
// 平面 2
glBindTexture(GL_TEXTURE_2D, texture[0]);
glColor3f(1,1,1);
glPushMatrix();
glTranslatef(0,0,-15);
glRotatef(90,1,0,0);
fx=(float)1/DIMX;
fz=(float)1/DIMZ;
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2f(fx*x,fz*z); glVertex3f(target[x][z][1].x,target[x][z][1].y,target[x][z][1].z);
glTexCoord2f(fx*x+fx,fz*z); glVertex3f(target[x+1][z][1].x,target[x+1][z][1].y,target[x+1][z][1].z);
glTexCoord2f(fx*x+fx,fz*z+fz); glVertex3f(target[x+1][z+1][1].x,target[x+1][z+1][1].y,target[x+1][z+1][1].z);
glTexCoord2f(fx*x,fz*z+fz); glVertex3f(target[x][z+1][1].x,target[x][z+1][1].y,target[x][z+1][1].z);
glEnd();
}
}
glPopMatrix();
// 平面 3
glColor3f(1,1,1);
glPushMatrix();
glTranslatef(-8,0,-8);
glRotatef(90,0,1,0);
glRotatef(90,1,0,0);
fx=(float)1/DIMX;
fz=(float)1/DIMZ;
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2f(fx*x,fz*z); glVertex3f(target[x][z][2].x,target[x][z][2].y,target[x][z][2].z);
glTexCoord2f(fx*x+fx,fz*z); glVertex3f(target[x+1][z][2].x,target[x+1][z][2].y,target[x+1][z][2].z);
glTexCoord2f(fx*x+fx,fz*z+fz); glVertex3f(target[x+1][z+1][2].x,target[x+1][z+1][2].y,target[x+1][z+1][2].z);
glTexCoord2f(fx*x,fz*z+fz); glVertex3f(target[x][z+1][2].x,target[x][z+1][2].y,target[x][z+1][2].z);
glEnd();
}
}
glPopMatrix();
// 平面4
glColor3f(1,1,1);
glPushMatrix();
glTranslatef(7,0,-8);
glRotatef(90,0,1,0);
glRotatef(90,1,0,0);
fx=(float)1/DIMX;
fz=(float)1/DIMZ;
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2f(fx*x,fz*z); glVertex3f(target[x][z][3].x,target[x][z][3].y,target[x][z][3].z);
glTexCoord2f(fx*x+fx,fz*z); glVertex3f(target[x+1][z][3].x,target[x+1][z][3].y,target[x+1][z][3].z);
glTexCoord2f(fx*x+fx,fz*z+fz); glVertex3f(target[x+1][z+1][3].x,target[x+1][z+1][3].y,target[x+1][z+1][3].z);
glTexCoord2f(fx*x,fz*z+fz); glVertex3f(target[x][z+1][3].x,target[x][z+1][3].y,target[x][z+1][3].z);
glEnd();
}
}
glPopMatrix();
// 平面5
glColor3f(1,1,1);
glPushMatrix();
glTranslatef(0,8,-7);
fx=(float)1/DIMX;
fz=(float)1/DIMZ;
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2f(fx*x,fz*z); glVertex3f(target[x][z][4].x,target[x][z][4].y,target[x][z][4].z);
glTexCoord2f(fx*x+fx,fz*z); glVertex3f(target[x+1][z][4].x,target[x+1][z][4].y,target[x+1][z][4].z);
glTexCoord2f(fx*x+fx,fz*z+fz); glVertex3f(target[x+1][z+1][4].x,target[x+1][z+1][4].y,target[x+1][z+1][4].z);
glTexCoord2f(fx*x,fz*z+fz); glVertex3f(target[x][z+1][4].x,target[x][z+1][4].y,target[x][z+1][4].z);
glEnd();
}
}
glPopMatrix();
glDisable(GL_TEXTURE_2D);
}
double CMissileTestView::VectorLength( Vector v )
{
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
}
Vector CMissileTestView::VectorNormalize( Vector v )
{
Vector vresult;
double l = VectorLength( v );
vresult.x = v.x/l;
vresult.y = v.y/l;
vresult.z = v.z/l;
return vresult;
}
Vector CMissileTestView::VectorMultiply( Vector v1, Vector v2 )
{
Vector vresult;
vresult.x = v1.y * v2.z - v1.z * v2.y;
vresult.y = v1.z * v2.x - v1.x * v2.z;
vresult.z = v1.x * v2.y - v1.y * v2.x;
return vresult;
}
Vector CMissileTestView::VectorScalarMultiply( Vector v, double s )
{
Vector vresult;
vresult.x = v.x * s;
vresult.y = v.y * s;
vresult.z = v.z * s;
return vresult;
}
Vector CMissileTestView::VectorDiff( Vector v1, Vector v2 )
{
Vector vresult;
vresult.x = v1.x - v2.x;
vresult.y = v1.y - v2.y;
vresult.z = v1.z - v2.z;
return vresult;
}
void CMissileTestView::Luce(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 = 0;
cz.y = 0;
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);
}
void CMissileTestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
// 视点模式
if(nChar==49) // 按下'1'键
{
var.cameratype=0;
}
if(nChar==50) // 按下'2'键
{
var.cameratype=1;
}
if(nChar==51) // 按下'3'键
{
var.cameratype=2;
}
if(nChar==52) // 按下'4'键
{
var.cameratype=3;
}
if(nChar==53) // 按下'5'键
{
var.cameratype=4;
}
if(nChar==54) // 按下'6'键
{
var.cameratype=5;
}
if(nChar==55) // 按下'7'键
{
var.cameratype=6;
}
if(nChar==56) // 按下'8'键
{
var.cameratype=7;
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -