1. 网格地形实验思路:
  • 通过两重for循环生成一个5*9的网格。

  • 通过glBegin(GL_TRIANGLES)函数将所有的四个点之间连接成两个三角形。

  • 通过两个相邻三角形之间坐标可以得知一个规律:

    右下角三角形坐标:
    glVertex3f(x, y, z);
    glVertex3f(x+1, y+1, sinf(x+1));
    glVertex3f(x+1, y, sinf(x+1));

    左上角三角形:
    glVertex3f(x, y, z);
    glVertex3f(x, y + 1, sinf(x ));
    glVertex3f(x + 1, y+1, sinf(x + 1));

  • 在TRIANGLES函数中调用两次两重for循环来完成所有三角形的绘制。

  • 通过上面的坐标可知z的值通过sin函数来改变的,从而产生地形的起伏效果。

  • 左上角三角形的颜色的值为glColor3f(x/6, y/10, 0);右下角的三角形的值为glColor3f(x / 5, y / 9, 0);产生地形颜色的渐变效果。

  • 最后在三角形绘制函数前加上绕三个轴旋转的函数,通过按键控制旋转角度的大小。

  1. 主要代码:
void render(void)   
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer   清理深度缓冲区  颜色
	glLoadIdentity();
   glTranslatef(x_trens,y_trens,z_trens);	
   glRotatef(angle, 0,1, 0);
	glRotatef(angle_1, 1, 0, 0);
	glRotatef(angle_2, 0, 0, 1);
   glBegin(GL_TRIANGLES);	        // Draw  Triangles
	float x = 0;
	float y;
	float z;
	for (x = 0; x < 5; x++)//X的赋值
	{
		for (y = 0; y < 9; y++)//Y的赋值
		{
			z = sinf(x);
			glColor3f(x/6, y/10, 0);
			glVertex3f(x, y, z);
			glVertex3f(x+1, y+1, sinf(x+1));
			glVertex3f(x+1, y, sinf(x+1));
		}
	}
	for (x = 0; x < 5; x++)//X的赋值
	{
		for (y = 0; y < 9; y++)//Y的赋值
		{
			z = sinf(x);
			glColor3f(x / 5, y / 9, 0);
			glVertex3f(x, y, z);
			glVertex3f(x, y + 1, sinf(x ));
			glVertex3f(x + 1, y+1, sinf(x  + 1));
		}
	}

	glEnd();
    // Swap The Buffers To Become Our Rendering Visible
    glutSwapBuffers ( );
}
void keyboard(unsigned char key, int x, int y)    //键盘控制旋转和移动
{
	switch (key) {
		case 27:        // When Escape Is Pressed...
			exit(0);    // Exit The Program
			//平移
		case 'd':
			x_trens += 0.5,glutPostRedisplay(); break;
		case 'a':
			x_trens -= 0.5, glutPostRedisplay(); break;
			//缩放
		case 'w':
			y_trens += 0.5, glutPostRedisplay(); break;
		case 's':
			y_trens -= 0.5, glutPostRedisplay(); break;
		case 'q':
			z_trens *= 0.5, glutPostRedisplay(); break;
		case 'e':
			z_trens /= 0.5, glutPostRedisplay(); break;
		case 'j':
			angle += 2, glutPostRedisplay(); break;
		case 'l':
			angle -= 2, glutPostRedisplay(); break;
		case 'i':
			angle_1 += 2, glutPostRedisplay(); break;
		case 'k':
			angle_1 -= 2, glutPostRedisplay(); break;
		case 'u':
			angle_2 += 2, glutPostRedisplay(); break;
		case 'o':
			angle_2 -= 2, glutPostRedisplay(); break;
			//
		        // Ready For Next Case
		default:        // Now Wrap It Up
		break;
	}
}