⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 missiletestview.cpp

📁 导弹试验模拟opengl源码,C语言开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -