- 网格地形实验思路:
-
通过两重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);产生地形颜色的渐变效果。
-
最后在三角形绘制函数前加上绕三个轴旋转的函数,通过按键控制旋转角度的大小。
- 主要代码:
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;
}
}