几何变换 之 平移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;
}

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

 

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