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 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论