标签:
OpenGL的glTranslatef平移变换函数详解
glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换。
我们先看定义:
void glTranslated(GLdouble x,
GLdouble y,
GLdouble z);
void glTranslatef(GLdouble x,
GLdouble y,
GLdouble z);
参数说明:
x,y,z:分别指定沿x,y,z轴方向的平移分量。
重点就是沿着x,y,z轴移动。
注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。
附上简单例子:
1 #include <stdio.h> 2 #include <math.h> 3 #include <Windows.h> 4 #include <gl/glut.h> 5 6 /* 7 功能描述:使用OpenGL简单画一个方正图形 8 平移变换函数gluTranslatef 9 */ 10 11 //输出模式,0-单缓存模式;非0双缓存模式 12 #define OUTPUT_MODE 1 13 14 //矩阵变换的坐标 15 float oldx = 0; 16 float oldy = 0; 17 18 //交叉点的坐标 19 int cx = 0; 20 int cy = 0; 21 22 void display(void) 23 { 24 //printf("oldx=%f, oldy=%f\n", oldx, oldy); 25 26 //glClearColor函数设置好清除颜色,glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色 27 glClearColor(1.0, 1.0, 0.8, 1.0); 28 glClear(GL_COLOR_BUFFER_BIT); 29 30 glLoadIdentity(); //加载单位矩阵 31 glTranslatef(oldx, oldy, 0); //将变换矩阵与当前矩阵相乘 32 33 glColor3f (1.0, 0.0, 1.0); //画笔梅红色 34 glBegin(GL_POLYGON); 35 { 36 glVertex2f(-0.2, -0.2); 37 glVertex2f(-0.2, 0.2); 38 glVertex2f(0.2, 0.2); 39 glVertex2f(0.2, -0.2); 40 } 41 glEnd(); 42 43 glColor3f (0.0, 0.0, 1.0); //画笔蓝色 44 //--------画直线START-------- 45 //画直线 46 glBegin(GL_LINES); 47 { 48 glVertex2f(-0.5, 0); 49 glVertex2f(0.5, 0); 50 glVertex2f(0, 0.5); 51 glVertex2f(0, -0.5); 52 } 53 glEnd(); 54 //--------画直线E N D-------- 55 56 57 if (OUTPUT_MODE == 0) { 58 glFlush();//单缓存GLUT_SINGLE时使用 59 } else { 60 glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示 61 } 62 } 63 64 //处理鼠标点击 65 void Mouse(int button, int state, int x, int y) 66 { 67 if(state == GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标 68 { 69 //记住鼠标点击后光标坐标 70 cx = x; 71 cy = y; 72 //printf("Mouse: x=%d, y=%d, oldx=%f, oldy=%f\n", x, y, oldx, oldy); 73 } 74 } 75 76 //处理鼠标拖动 77 void onMouseMove(int x, int y) 78 { 79 //计算拖动后的偏移量,然后进行xy叠加减 80 oldx += ((x - cx) * 0.01); 81 oldy -= ((y - cy) * 0.01); 82 printf("Move: x=%d(%d)[%d], y=%d(%d)[%d], oldx=%f, oldy=%f\n", x, cx, x-cx, y, cy, y-cy, oldx, oldy); 83 glutPostRedisplay(); 84 85 //保存好当前拖放后光标坐标点 86 cx = x; 87 cy = y; 88 } 89 90 void reshape(int w, int h) 91 { 92 int offset = 50; 93 int dis = (w > h ? h : w) - offset * 2; 94 95 //配置显示物体屏幕的大小 96 glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis); 97 printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis); 98 99 glMatrixMode(GL_PROJECTION); 100 glLoadIdentity(); 101 102 glOrtho(-1.5, 1.5, -1.5, 1.5, 0, 10); 103 //gluOrtho2D(-1.5, 1.5, -1.5, 1.5); 104 105 glMatrixMode(GL_MODELVIEW); 106 glLoadIdentity(); 107 } 108 109 int main(int argc, char *argv[]) 110 { 111 printf("可通过鼠标拖动控制图形平行移动\n"); 112 glutInit(&argc, argv); 113 114 glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == 0 ? GLUT_SINGLE : GLUT_DOUBLE)); 115 glutInitWindowPosition(100, 100); 116 glutInitWindowSize(400, 400); 117 118 glutCreateWindow("第一个 OpenGL 程序"); 119 120 glutDisplayFunc(&display); 121 //glutIdleFunc(display); //设置不断调用显示函数 122 glutReshapeFunc(reshape); 123 glutMouseFunc(Mouse); 124 glutMotionFunc(onMouseMove); 125 glutMainLoop(); 126 return 0; 127 }
最后附上一个写的比我的更有意思的代码:
http://www.cnblogs.com/opengl/archive/2012/11/06/2757854.html
标签:
原文地址:http://www.cnblogs.com/1024Planet/p/5647547.html