OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解
先看⼀下函数定义:
void glRotatef(GLfloat angle,
        GLfloat x,
          GLfloat y,
          GLfloat z)
angle:为旋转的⾓度,单位为度。
x,y,z:为对应xyz轴的布尔值变量。
重点是x,y,z表达的是什么意思呢?应该如何取值?
如果说x,y,z表达的是⼀个坐标(x,y,z),那么这个函数就说明了当前⼏何图形围着这个坐标点旋转。
但往哪个⽅向旋转呢?所以很明显,x,y,z表达的意思并不是坐标点,⽽是要围绕哪个坐标轴旋转。
即其实这⾥的x,y,z值相当于⼀个布尔值,0.0表⽰假,⽽⾮零参数则表⽰真。
所以如果你想让当前的⼏何图形围绕着z轴旋转,那么x和y都设为0,⽽z设为⾮零值即可。
如果这⾥的x,y,z的值都设置为0.0,那么将围绕着x轴旋转。
还有⼀点需要注意,如果设置的旋转值(x,y,z的值)为正数,那么旋转的⽅向是逆时针的,如果旋转值是负数,那么旋转的⽅向是顺时针的。
假设:glRotatef(45,1,0,0)
物体如何旋转?
想象:从坐标(0,0,0)即原点,引出⼀条线到(1,0,0),⽤右⼿握住这条线.
这时,你会问,如何握?
右⼿⼤拇指指向(0,0,0)⾄(1,0,0)的⽅向才握。
另外四个⼿指的弯曲指向即是物体旋转⽅向。
为什么是右⼿握住,⽽不是左⼿呢?
因为OpenGL是右⼿原则。
最后附上代码供参考:
1 #include <stdio.h>
2 #include <gl/glut.h>
3
4/*
5功能描述:使⽤OpenGL简单画⼀个旋转的三⾓形
6旋转变换函数glRotatef
7*/
8
9//输出模式,0-单缓存模式;⾮0双缓存模式
10#define OUTPUT_MODE 1
11
12//⾓度
13int angle = 0;
14
15int xyz[3] = {0, 0, 0};
16
17void display(void)
18 {
19//printf("xyz={%d,  %d,  %d\n}", xyz[0], xyz[1], xyz[2]);
20
21    glClear(GL_COLOR_BUFFER_BIT);
22
23
24    glLoadIdentity();
25    glRotatef(angle, xyz[0], xyz[1], xyz[2]);
26
27    glBegin(GL_TRIANGLES);
28    {
29        glVertex3f(0.0f, 0.0f, 0.0f);
30        glVertex3f(0.5f, 0.0f, 0.0f);
31        glVertex3f(0.0f, 0.5f, 0.0f);
32    }
33    glEnd();
34
35    angle += 1;
36    angle %= 360;
37
38if (OUTPUT_MODE == 0) {
39        glFlush();//单缓存GLUT_SINGLE时使⽤
40    } else {
41        glutSwapBuffers();//因为使⽤的是双缓存GLUT_DOUBLE,所以这⾥必须要交换缓存才会显⽰
42    }
43 }
44
45//按键
46void keyboard(unsigned char key, int x, int y)
47 {
48switch (key)
49    {
50case'x':
51case'X':
52        xyz[0] = 1;
53        xyz[1] = xyz[2] = 0;
54break;
55case'y':
56case'Y':
57        xyz[1] = 1;
58        xyz[0] = xyz[2] = 0;
59break;
60case'z':
61case'Z':
62        xyz[2] = 1;
63        xyz[0] = xyz[1] = 0;
64break;
65case'a':
66case'A':
67        xyz[0] = xyz[1] = xyz[2] = 0;
68break;
69case'b':
70case'B':
71        xyz[0] = xyz[1] = xyz[2] = 1;
72break;
73default:
74break;
75    }
76    printf("当前绕%c轴旋转\n", key);
77    glutPostRedisplay();
78 }
79
80void reshape(int w, int h)
81 {
82int offset = 50;
83int dis = (w > h ? h : w) - offset * 2;
84
85//配置显⽰物体屏幕的⼤⼩
86    glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis);
87    printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis);
88
89    glMatrixMode(GL_PROJECTION);
90    glLoadIdentity();
91
92    glOrtho(-1.5, 1.5, -1.5, 1.5, 0, 10);
93//gluOrtho2D(-1.5, 1.5, -1.5, 1.5);
94
95    glMatrixMode(GL_MODELVIEW);
96    glLoadIdentity();
97 }
98
99int main(int argc, char *argv[])
100 {
101    printf("可通过按键xyzab控制图形旋转原点/轴\n");
102    glutInit(&argc, argv);
103
104    glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == 0 ? GLUT_SINGLE : GLUT_DOUBLE)); 105    glutInitWindowPosition(100, 100);
106    glutInitWindowSize(400, 400);
107
108    glutCreateWindow("第⼀个 OpenGL 程序");
109
110    glutDisplayFunc(&display);
111    glutIdleFunc(display);  //设置不断调⽤显⽰函数
库函数printf详解112    glutReshapeFunc(reshape);
113    glutKeyboardFunc(&keyboard);
114    glutMainLoop();
115return0;
116 }