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

📄 renderview.cpp

📁 此书为Visual C++ 高级编程技术OpenGL篇
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  int x, z;
  int r = 256; // 随机数最大值
  float gradient, shadow = 0.5, max = 0;
  FILE *fp;

   if((fp=fopen("airport.asc.","rb"))==NULL) return;
		float XCorner, YCorner;
		int OridtmDX, OridtmDY;
		float CellSize;
        fread(&XCorner,sizeof(float),1,fp);
		fread(&YCorner,sizeof(float),1,fp);
		fread(&OridtmDX,sizeof(int),1,fp);
		fread(&OridtmDY,sizeof(int),1,fp);
		fread(&CellSize,sizeof(float),1,fp);
   
        fread(y,sizeof(float),MAP*MAP,fp);
	    for (x = 0; x < MAP; x++ )
	 	    for ( z = 0; z < MAP; z++)
			    y[x][z] /=2.0;
        fclose(fp);
		// 在地形中随机生成一些树木
		for(x=0; x<MAP; x++){
			for(z=0; z<MAP; z++) {
				if(rand()%13==0 && y[x][z]>0)
					object[x][z] = 't';
				else
					object[x][z] = 'n';
			}
		}
 
		for(x=0; x<=MAP; x++){
			for(z=0; z<=MAP; z++) {
				gradient = ((GLfloat) (y[x][z]-y[x+1][z])) / 100.0f;
				if(y[x][z]>64) {
					if((y[x][z]-y[x][z+1])<8 && (y[x][z]-y[x][z+1])>-8 && (y[x][z]-y[x+1][z])<8 && (y[x][z]-y[x+1][z])>-8) {
					c[x][z].g = gradient + 0.75f;
					c[x][z].r = c[x][z].g;
					c[x][z].b = c[x][z].g;
				}
				else {
					c[x][z].r = gradient + 0.75f;
					c[x][z].g = c[x][z].r*0.8f;
					c[x][z].b = c[x][z].r*0.5f;
				}
			}  else
			if(y[x][z]>0){
				c[x][z].g = gradient + 0.75f;
				c[x][z].r = c[x][z].g * 0.6f;
				c[x][z].b = 0.0f;
			}
            else {
				c[x][z].r = gradient + 1.0f;
				c[x][z].g = c[x][z].r * 0.75f;
				c[x][z].b = c[x][z].r * 0.5f;
			}
		}
	}
}

void CRenderView::MakeTexture(void) {
  int i, j;
  FILE *fp;
  unsigned char *image;
  int rc;

  fp = fopen("res\\texture.bmp","rb");
  if(!fp) return;
  fseek(fp,54,SEEK_SET);
  image = (unsigned char *)malloc(WIDTH*WIDTH*3);
  rc=fread(image,sizeof(unsigned char),WIDTH*WIDTH*3,fp);
  fclose(fp);
  for(i=0; i<WIDTH; i++) {
     for(j=0; j<WIDTH; j++) {
      texImg[i][j][0] = (GLubyte) *(image+i*WIDTH*3+j*3);
      texImg[i][j][1] = (GLubyte) *(image+i*WIDTH*3+j*3+1);
      texImg[i][j][2] = (GLubyte) *(image+i*WIDTH*3+j*3+2);
      texImg[i][j][3] = (GLubyte) 255;
     }
   }
}

void CRenderView::CheckHeight(void) {

  float x0, x1, lx, lz, x, z, midpoint;
  int fx, fz;

  x = (patriot_posx/(comp*1.0f));
  z = (patriot_posz/(comp*1.0f));
  fx = (int)(x);
  fz = (int)(z);
  lx = x - fx;
  lz = z - fz;
  x0 = y[fx][fz] + (y[fx][fz+1] - y[fx][fz])*lz;
  x1 = y[fx+1][fz] + (y[fx+1][fz+1] - y[fx+1][fz])*lz;
  midpoint = x0 + (x1 - x0)*lx;
  patriot_posy = midpoint + 50.0f;
}

void CRenderView::DrawTree(int x, int z)
{

  int x1, y1, z1;
    
    y1 = (int)y[x][z];
    x1 = (int)x * comp;
    z1 = (int)z * comp;

  glEnable(GL_TEXTURE_2D);
  glBegin(GL_POLYGON);
  glColor3f(0.6f, 0.4f, 0.0f);
  glVertex3f((float)x1-1, (float)y1+5, (float)z1);
  glVertex3f((float)x1+1, (float)y1+5, (float)z1);
  glVertex3f((float)x1+1, (float)y1, (float)z1);
  glVertex3f((float)x1-1, (float)y1, (float)z1);
  glEnd();
  
  glBegin(GL_POLYGON);
  glVertex3f((float)x1, (float)y1+5, (float)z1-2);
  glVertex3f((float)x1, (float)y1+5, (float)z1+2);
  glVertex3f((float)x1, (float)y1, (float)z1+2);
  glVertex3f((float)x1, (float)y1, (float)z1-2);
  glEnd();

  glBegin(GL_POLYGON);
  glColor3f(0.35f, 0.7f, 0.0f);
  glTexCoord2f(0.0f, 0.0f);
  glVertex3f((float)x1-10, (float)y1+5, (float)z1);
  glTexCoord2f(0.5f, 1.0f);
  glVertex3f((float)x1, (float)y1+25, (float)z1);
  glTexCoord2f(1.0f, 0.0f);
  glVertex3f((float)x1+10, (float)y1+5, (float)z1);
  glEnd();

  glBegin(GL_POLYGON);
  glColor3f(0.4f, 0.8f, 0.0f);
  glTexCoord2f(0.0f, 0.0f);
  glVertex3f((float)x1, (float)y1+5, (float)z1-10);
  glTexCoord2f(0.5f, 1.0f);
  glVertex3f((float)x1, (float)y1+25, (float)z1);
  glTexCoord2f(1.0f, 0.0f);
  glVertex3f((float)x1, (float)y1+5, (float)z1+10);
  glEnd();
}

// Function that moves the eye or turns the angle of sight.
// Updates scene if update != 0.
void CRenderView::MoveEye(int type, GLfloat amount, int update)
{
  GLfloat a;
  
  switch(type){
    case FORWARD:
      patriot_posx += lookx*amount*2;
      patriot_posz += lookz*amount*2;
      break;
    case TURNLEFT:
      lookx = lookx*(float)cos(amount) + lookz*(float)sin(amount);
      lookz = lookz*(float)cos(amount) - lookx*(float)sin(amount);
      // 因为浮点数计算存在误差,因此有时lookx^2 + lookz^2 != 1,以下进行校正
      a = 1.0f / (float)sqrt(lookx*lookx + lookz*lookz);
      lookx *= a;
      lookz *= a;
      break;
    case STRAFELEFT:
      patriot_posx += lookz * amount;
      patriot_posz -= lookx * amount;
      break;
    case UP:
      patriot_posy += amount;
      break;
    case LOOKUP:
      looky += amount;
      break;
  }
  CheckHeight();
  glPushMatrix();
  glPopMatrix();
  if (update){
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();
	glBegin(GL_POLYGON);
	glVertex3f(patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz);
    glVertex3f(patriot_posx+lookx, patriot_posy+looky+10, patriot_posz+lookz);
	glVertex3f(patriot_posx+lookx, patriot_posy+looky-10, patriot_posz+lookz);
	glEnd();
  }
}

void CRenderView::DrawPatriot(void)
{
	GLfloat no_mat[] = { 0.05f, 0.05f, 0.05f, 1.0f };
	GLfloat mat_ambient[] = { 0.35f, 0.35f, 0.45f, 1.0f };
	GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.8f, 1.0f };
	GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat no_shininess[] = { 0.0f };
	GLfloat low_shininess[] = { 100.0f };
	GLfloat high_shininess[] = { 10.0f };
	GLfloat mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};
    GLfloat ambient[4] = { 0.2f, 0.2f, 0.3f, 1.0f };
    GLfloat diffuse[4] = { 0.8f, 0.8f, 1.0f, 1.0f };
    GLfloat specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat position[4] = { 10.0f,10.0f,10.0f, 1.0f };
   
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR,specular);
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	
	glEnable (GL_LIGHTING);
	glEnable (GL_LIGHT0);

	glMaterialfv(GL_FRONT, GL_AMBIENT,  mat_ambient);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION,  no_mat);
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	glmDraw(patriot, GLM_SMOOTH|GLM_MATERIAL);
	glDisable(GL_LIGHTING);
}

void CRenderView::DrawPlane(void)
{
	GLfloat no_mat[] = { 0.05f, 0.05f, 0.05f, 1.0f };
	GLfloat mat_ambient[] = { 0.35f, 0.35f, 0.45f, 1.0f };
	GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.8f, 1.0f };
	GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat low_shininess[] = { 100.0f };
	GLfloat mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};
    GLfloat ambient[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat diffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
    GLfloat position[4] = { 0.0f,0.0f,10.0f, 1.0f };

	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR,specular);
	glLightfv(GL_LIGHT0, GL_POSITION, position);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
	glMaterialfv(GL_FRONT, GL_AMBIENT,  mat_ambient);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION,  no_mat);
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
	glmDraw(plane, GLM_SMOOTH);
	glDisable(GL_LIGHTING);
}

void CRenderView::TrackObj(void)
{
    float ta=-90.0f, thita=ta*PI/180.0f, distance=20.0f;
    static GLuint FireList = 0;
	CPaintDC dc(this); 
	
	HWND hWnd = GetSafeHwnd();
	HDC hDC = ::GetDC(hWnd);
	wglMakeCurrent(hDC,m_hGLContext);

    glPushMatrix();
	glLoadIdentity();
	gluLookAt(patriot_posx, patriot_posy, patriot_posz,patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz, 0.0f,1.0f,0.0f);
    glTranslatef(patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz);
	if (Shoot){
		glRotatef(-90,1,0,0);
		glRotatef(-30,0,1,0);
		glTranslatef(0, 5, 0);
		DrawPatriot();
		glCallList(FireList+1);
		FireList = (FireList+1) % LIST;
	}	else {
		glRotatef(-90,1,0,0);
		glRotatef(-30,0,0,1);
		DrawPlane();
	}
	if (L>12 || L<10) flag=1-flag;
	if (flag) L-=0.1f; else L+=0.1f;
	counter++;
	patriot_posx=patriot_posx-(float)cos(thita)*14.0f;
	patriot_posz=patriot_posz+(float)sin(thita)*14.0f;
	CheckHeight();
	glDisable(GL_BLEND);
    glPopMatrix();
}

void CRenderView::GenFire()
{
	float r,dt,dy,t,y;
	int k, l, ff, i, j, list;

	for (list=0; list<LIST; list++){
		srnd=0;
		for (i=0;i<CN;i++){
			tmp[i][0]=(float)(cos(i*2.0f*PI/CN));
			tmp[i][1]=(float)(sin(i*2.0f*PI/CN));
		}
		for (j=0; j<6; j++)
			for (k=0; k<CN; k++){
				red_green[j][k]=2*rand()/32767.0f;
				tail[j][k]=TAILL*rand()/32767.0f+1;
			}

		ff=(srnd++)%6;
		dt=(float)(DT/L*PI);
		dy=(float)((L-DT)/VN);
		y=0;

		for(k=0;k<=VN;k++)
		{
			r=(float)(H*sin(y*PI/L+dt));
			for(l=0;l<CN;l++)
			{
				vetxm[list][k][l][0]=r*tmp[l][0];
				vetxm[list][k][l][1]=-y;
				vetxm[list][k][l][2]=r*tmp[l][1];
				vetxm[list][k][l][6]=1;
				if (y<=red_green[ff][l]){
					t=y/red_green[ff][l];
					vetxm[list][k][l][3]=vetxm[list][k][l][4]=t*t+0.1f;
					vetxm[list][k][l][4]=vetxm[list][k][l][3]-0.3f;
					vetxm[list][k][l][5]=vetxm[list][k][l][4]+0.4f;
				}   else {
					vetxm[list][k][l][3]=1.0f-y/(L-DT+ADDL);
					vetxm[list][k][l][4]=vetxm[list][k][l][3]-0.3f;
					vetxm[list][k][l][5]=0.08f;
				}
				t=L-DT-y;
				if(t<=tail[ff][l])
					vetxm[list][k][l][6]=0;
			}
			y+=dy;
		}
	}
}

void CRenderView::MakeFireList()
{
	int k, l,list;

	for (list = 0; list < LIST; list++){
		glNewList(list+1, GL_COMPILE);
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA,GL_ONE);
		glDisable(GL_LIGHTING);
		glDisable(GL_DEPTH_TEST);
		for(k=0;k<VN;k++)
		{
			for(l=0;l<CN-1;l++)
			{
				glBegin(GL_POLYGON);
				glColor4f(vetxm[list][k][l][3],vetxm[list][k][l][4],vetxm[list][k][l][5],vetxm[list][k][l][6]);
				glVertex3f(vetxm[list][k][l][0],vetxm[list][k][l][1],vetxm[list][k][l][2]);
				glColor4f(vetxm[list][k+1][l][3],vetxm[list][k+1][l][4],vetxm[list][k+1][l][5],vetxm[list][k+1][l][6]);
				glVertex3f(vetxm[list][k+1][l][0],vetxm[list][k+1][l][1],vetxm[list][k+1][l][2]);
				glColor4f(vetxm[list][k+1][l+1][3],vetxm[list][k+1][l+1][4],vetxm[list][k+1][l+1][5],vetxm[list][k+1][l+1][6]);
				glVertex3f(vetxm[list][k+1][l+1][0],vetxm[list][k+1][l+1][1],vetxm[list][k+1][l+1][2]);
				glColor4f(vetxm[list][k][l+1][3],vetxm[list][k][l+1][4],vetxm[list][k][l+1][5],vetxm[list][k][l+1][6]);
				glVertex3f(vetxm[list][k][l+1][0],vetxm[list][k][l+1][1],vetxm[list][k][l+1][2]);
				glEnd();
				glFlush();
			}
			glBegin(GL_POLYGON);
			glColor4f(vetxm[list][k][l][3],vetxm[list][k][l][4],vetxm[list][k][l][5],vetxm[list][k][l][6]);
			glVertex3f(vetxm[list][k][l][0],vetxm[list][k][l][1],vetxm[list][k][l][2]);
			glColor4f(vetxm[list][k+1][l][3],vetxm[list][k+1][l][4],vetxm[list][k+1][l][5],vetxm[list][k+1][l][6]);
			glVertex3f(vetxm[list][k+1][l][0],vetxm[list][k+1][l][1],vetxm[list][k+1][l][2]);
			glColor4f(vetxm[list][k+1][0][3],vetxm[list][k+1][0][4],vetxm[list][k+1][0][5],vetxm[list][k+1][0][6]);
			glVertex3f(vetxm[list][k+1][0][0],vetxm[list][k+1][0][1],vetxm[list][k+1][0][2]);
			glColor4f(vetxm[list][k][0][3],vetxm[list][k][0][4],vetxm[list][k][0][5],vetxm[list][k][0][6]);
			glVertex3f(vetxm[list][k][0][0],vetxm[list][k][0][1],vetxm[list][k][0][2]);
			glEnd();
		}
		glFlush();
		glDisable(GL_BLEND);
		glDisable(GL_CULL_FACE);
		glEnable(GL_DEPTH_TEST);
		glEndList();
	}
}

void CRenderView::OnTimer(UINT nIDEvent) 
{
	loop+=1.0f;
	Invalidate(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -