OpenGL的glScalef縮放變換函數詳解


glScalef是openGL中的模型縮放函數,就是把當前矩陣與一個表示延各個軸對物體進行拉伸、壓縮、反射的矩陣相乘。這個物體的每個點的x,y,z坐標與對應的xyz參數相乘。

先看函數定義
void glScalef(GLfloat x,
         GLfloat y,
         GLfloat z);

參數x,y,z分別為模型在x,y,z軸方向的縮放比。

例如:
如glScalef(2.0f,3.0f,4.0f);將模型按x,y,z方向分別拉伸了2,3,4倍。
參數也可取負數,也可以理解為先關於某軸翻轉180°,再縮放;
如glScalef(1.0f,1.0f,-1.0f);將模型關於z軸翻轉了180°(即關於xy軸所在平面對稱);
如glScalef(1.0f,1.0f,-2.0f);將模型關於-z軸拉伸2倍。

 

附上代碼例子:

  1 #include <stdio.h>
  2 #include <Windows.h>
  3 #include <gl/glut.h>
  4 
  5 /*
  6  功能描述:使用OpenGL簡單畫一個虛心水壺
  7  縮放變換函數glScalef
  8  */
  9 
 10 //輸出模式,0-單緩存模式;非0雙緩存模式
 11 #define OUTPUT_MODE 1
 12 
 13 float scale = 0.0;
 14 bool add = true;
 15 
 16 unsigned char axle = 'x';
 17 
 18 void init(void)
 19 {
 20     //glClearColor函數設置好清除顏色,glClear利用glClearColor函數設置好的當前清除顏色設置窗口顏色
 21     glClearColor(1.0, 1.0, 0.8, 1.0);
 22 }
 23 
 24 void display(void)
 25 {
 26     printf("scale=%f, axle=%c\n", scale, axle);
 27     glClear(GL_COLOR_BUFFER_BIT);
 28 
 29     //配置縮放比例大小scale
 30     scale = (add ? scale + 0.1 : scale - 0.1);
 31     if (scale >= 2.0)
 32     {
 33         add = false;
 34     } else if (scale <= 0.0) {
 35         add = true;
 36     }
 37     //開始繪畫
 38     glPushMatrix();
 39     {
 40         if (axle == 'x') {
 41             glScalef(scale, 1, 1);
 42         } else if (axle == 'y') {
 43             glScalef(1, scale, 1);
 44         } else if (axle == 'z') {
 45             glScalef(1, 1, scale);
 46         } else {            
 47             glScalef(scale, scale, scale);
 48         }
 49         glColor3f (1.0, 0.0, 1.0); //畫筆梅紅色
 50         glBegin(GL_POLYGON);
 51         glVertex2f(-0.2, -0.2);
 52         glVertex2f(-0.2, 0.2);
 53         glVertex2f(0.2, 0.2);
 54         glVertex2f(0.2, -0.2);
 55         glEnd();
 56     }
 57     glPopMatrix();
 58     
 59     glLoadIdentity();  //加載單位矩陣
 60     glColor3f (0.0, 0.0, 1.0); //畫筆藍色
 61     //--------畫直線START--------
 62     //畫直線
 63     glBegin(GL_LINES);
 64     glVertex2f(-0.5, 0);
 65     glVertex2f(0.5, 0);
 66     glVertex2f(0, 0.5);
 67     glVertex2f(0, -0.5);
 68     glEnd();
 69     //--------畫直線E N D--------
 70         
 71     if (OUTPUT_MODE == 0) {
 72         glFlush();//單緩存GLUT_SINGLE時使用
 73     } else {
 74         glutSwapBuffers();//因為使用的是雙緩存GLUT_DOUBLE,所以這里必須要交換緩存才會顯示
 75     }
 76 
 77     Sleep(50);
 78 }
 79 
 80 void reshape(int w, int h)
 81 {
 82     int offset = 50;
 83     int 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 
 99 void keyboard(unsigned char key, int x, int y)
100 {
101     switch (key) {
102         case 'x':
103         case 'X':
104             axle = 'x';
105             glutPostRedisplay();
106             break;
107         case 'y':
108         case 'Y':
109             axle = 'y';
110             glutPostRedisplay();
111             break;
112         case 'z':
113         case 'Z':
114             axle = 'z';
115             glutPostRedisplay();
116             break;
117         case 'a':
118         case 'A':
119             axle = 'a';
120             glutPostRedisplay();
121             break;
122         default:
123             break;
124     }
125     printf("按鍵%c\n", key);
126 }
127 
128 int main(int argc, char *argv[])
129 {
130     printf("可通過按鍵xyza控制圖形按哪一軸縮放\n");
131     glutInit(&argc, argv);
132     
133     glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == 0 ? GLUT_SINGLE : GLUT_DOUBLE));
134     glutInitWindowPosition(100, 100);
135     glutInitWindowSize(400, 400);
136     glutCreateWindow("第一個 OpenGL 程序");
137 
138     init();
139     glutDisplayFunc(&display);
140     glutIdleFunc(display);  //設置不斷調用顯示函數
141     glutReshapeFunc(reshape);
142     glutKeyboardFunc(keyboard);
143     glutMainLoop();
144     return 0;
145 }

按x軸縮放:

 

按y軸縮放:

 

按z軸縮放:

 

按xyz軸縮放:

 


免責聲明!

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



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