幾何變換 之 平移glTranslatef 旋轉glRotatef

代碼實現功能如下:

       繪製一個小球,並且實現用兩個鍵來控制一個小球前進與後退的滾動效果,其中按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;
}

    肝了一下午,,,我好難啊!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章