隨筆- 80
文章- 0
評論- 9
</div><!--end: blogStats -->
</div><!--end: navigator 博客導航欄 -->
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軸縮放:
分類: OpenGL
</div>
<div class="postDesc">posted @ <span id="post-date">2016-07-07 14:57</span> <a href="http://www.cnblogs.com/1024Planet/">追尋1024的程序猿</a> 閱讀(<span id="post_view_count">3659</span>) 評論(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5650131" rel="nofollow">編輯</a> <a href="#" onclick="AddToWz(5650131);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=204234,cb_entryId=5650131,cb_blogApp=currentBlogApp,cb_blogUserGuid='1e616d2e-4bef-e211-8d02-90b11c0b17d6',cb_entryCreatedDate='2016/7/7 14:57:00';loadViewCount(cb_entryId);var cb_postType=1;</script>
</div><!--end: forFlow -->
</div>
轉載出處:https://www.cnblogs.com/1024Planet/p/5650131.html
【推薦】Vue.js 2.x 快速入門,大量高效實戰示例
【活動】騰訊雲 學生專屬優惠套餐 多規格選擇
· 微軟不是修改源代碼來修復bug的?
· 遊戲開發者指責微軟毀掉Windows Phone之夢
· 全球最大飛艇Airlander 10受損 兩名工作人員受傷
· 投行正在讓程序員變成交易員接管交易
· 騰訊信用分終於開始啓用了:免押金騎摩拜
» 更多新聞…
· 關於編程,你的練習是不是有效的?
· 改善程序員生活質量的 3+10 習慣
· NASA的10條代碼編寫原則
· 爲什麼你參加了那麼多培訓,卻依然表現平平?