OpenGL的glTranslatef平移變換函數詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM