欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

几何变换 之 平移glTranslatef 旋转glRotatef

程序员文章站 2022-07-12 23:22:58
...

代码实现功能如下:

       绘制一个小球,并且实现用两个键来控制一个小球前进与后退的滚动效果,其中按F键前进,按B键后退。

 几何变换 之 平移glTranslatef 旋转glRotatef

#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;
}

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