代碼實現功能如下:
繪製一個小球,並且實現用兩個鍵來控制一個小球前進與後退的滾動效果,其中按F鍵前進,按B鍵後退。
#include <GL/glut.h>
#include <stdlib.h>
static int day = 0;
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT); //將窗口的背景設置爲當前清空顏色
glColor3f (1.0, 0.0, 0.0);
glPushMatrix(); //把當前矩陣壓入堆棧
//glutWireSphere(1.0, 20, 16); /* draw sun */
//glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
//glTranslatef (1.0, 0.0, 0.0); //平移矩陣構造函數,把當前矩陣和一個表示移動物體的矩陣相乘
glTranslatef ((GLfloat) day/360*0.3*3.1415, 0.0, 0.0);
glRotatef ((GLfloat) (day%360), 0.0, 0.0, 1.0);//旋轉矩陣構造函數,把當前矩陣和一個表示旋轉物體的矩陣相乘
glutWireSphere(0.3, 10, 10); // draw smaller planet 繪製球體並指定球體的大小。
glPopMatrix(); //從堆棧棧頂彈出一個矩陣爲當前矩陣
glutSwapBuffers();
}
void reshape (int w, int h) //窗口被移動或修改大小後的寬度和高度
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);//調整像素矩形,用於繪製整個窗口
glMatrixMode (GL_PROJECTION);//接下來三個函數調整繪圖座標系,使左下角位置爲(0, 0),右上角爲(w, h)
glLoadIdentity ();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW); //設置當前操作的矩陣爲“模型視圖矩陣”,指定一個4×4的建模矩陣作爲當前矩陣
glLoadIdentity(); //把當前矩陣設置爲單位矩陣
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //指定視圖變換,把照相機放在(0,0,5),鏡頭瞄準(0,0,0),朝上向量定爲(0,1,0)
//如果沒有調用gluLookAt(),默認的情況下,照相機位於原點,指向Z軸負方向,朝上向量爲(0,1,0)
}
void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 'F':
day = day + 10;
glutPostRedisplay();
break;
case 'B':
day = day - 10;
glutPostRedisplay();
break;
/*
case 'y':
year = (year + 5) % 360;
glutPostRedisplay();
break;
case 'Y':
year = (year - 5) % 360;
glutPostRedisplay();
break;
*/
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv){
glutInit(&argc, argv); //對GLUT進行初始化
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(100, 100); //設置窗口在屏幕中的位置
glutInitWindowSize(500, 500); //設置窗口的大小
glutCreateWindow (argv[0]); //參數將被作爲窗口的標題
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
肝了一下午,,,我好難啊!!!