opengl繪製桌子(平移、旋轉、縮放)
主要儀器裝置
VisualStudio C++2015
Windows10環境
Glut壓縮包
Ex2工程
操作方法和實驗步驟1.繪製立方體
桌子由立方體組成,我們可以通過繪製六個面來構造一個立方體。六個面的繪製需要八個頂點的引數,而每個頂點均有x,y,z三個引數,如果全部傳入的話引數的個數會達到8*3=24個。而我們只需要知道2個x,2個y以及2個z即可構造八個頂點。如圖所示,它們的座標分別是(x1,y1,z2), (x2,y1,z2), (x1,y2,z2), (x2,y2,z2), (x1,y1,z1),(x2,y1,z1), (x1,y2,z1), (x2,y2,z1)。每個面使用QL_QUADS方式繪製所使用的頂點是(v1,v2,v4,v3),(v5,v6,v8,v7), (v3,v4,v8,v7), (v1,v2,v6,v5), (v1,v3,v7,v5), (v2,v4,v8,,v6)。
2.繪製桌子
之前已經完成了繪製立方體的函式,現在只需要把桌子拆分成5個立方體進行繪製就可以了。計算需要傳入的引數,使用Draw_Cube函式進行繪製。
3.模型變換——平移、旋轉、縮放
這部分功能的實現通過重繪時呼叫函式redraw實現。根據要求使用glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);來確定顯示模式為使用線段顯示物體所有面。在模型進行平移、旋轉、縮放時用到的函式分別是glTranslatef,glRotatef以及glScalef函式。這三個函式中分別利用了三個因子fTranslate,fRotate以及fScale。他們控制了平移的方向,旋轉軸以及縮放尺寸等等。
程式碼如下:
// main.cpp : 定義控制檯應用程式的入口點。 #include "glut.h" float fTranslate;//平移因子 float fRotate;//旋轉因子 float fScale=1.0f;//縮放因子 void Draw_Cube(GLfloat x1, GLfloat x2, GLfloat y1,GLfloat y2,GLfloat z1,GLfloat z2) { //桌子由立方體組成,已知六個引數即可構造八個頂點 int i, j; GLfloat vertex[8][3] = { //八個頂點,從v1-v8 x1,y1,z2, x2,y1,z2, x1,y2,z2, x2,y2,z2, x1,y1,z1, x2,y1,z1, x1,y2,z1, x2,y2,z1 }; GLint surface[6][4] = { //v1對應0,以此類推 0,1,3,2, 4,5,7,6, 2,3,7,6, 0,1,5,4, 0,2,6,4, 1,3,7,5 }; glBegin(GL_QUADS);//指定繪製方式 //將每個立方體分成六個面繪製 for (i = 0; i < 6; i++) for (j = 0; j < 4; j++) glVertex3fv(vertex[surface[i][j]]); glEnd(); } void Draw_Table() { //將桌子拆分成5個立方體繪製 Draw_Cube(0.0, 1.0, 0.0, 0.8, 0.6, 0.8);//桌面 Draw_Cube(0.1, 0.3, 0.1, 0.3, 0.0, 0.6);//四條腿 Draw_Cube(0.7, 0.9, 0.1, 0.3, 0.0, 0.6); Draw_Cube(0.1, 0.3, 0.5, 0.7, 0.0, 0.6); Draw_Cube(0.7, 0.9, 0.5, 0.7, 0.0, 0.6); } void reshape(int width, int height) { //當視窗尺寸改變時改變尺寸 if (height==0) // Prevent A Divide By Zero By { height=1; // Making Height Equal One } glViewport(0,0,width,height); // Reset The Current Viewport glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix // Calculate The Aspect Ratio Of The Window gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix } void idle() { glutPostRedisplay(); } void redraw() { //display in wireframe mode glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glClear(GL_COLOR_BUFFER_BIT);//清除視窗 glLoadIdentity(); // Reset The Current Modelview Matrix //模型變換——移動 glPushMatrix();//glpushmatrix與glpopmatrix配合使用可以消除上一次變換對本次變換的影響 glTranslatef(-2.5f, 0.0f,-6.0f);//放在左邊 glTranslatef(0.0f, fTranslate, 0.0f); Draw_Table(); glPopMatrix(); //模型變換——旋轉 glPushMatrix(); glTranslatef(0.0f, 0.0f,-6.0f);//放在中間 glRotatef(fRotate, 0, 1.0f, 0); // Rotate around Y axis Draw_Table(); // Draw triangle glPopMatrix(); //模型變換——縮放 glPushMatrix(); glTranslatef(2.0f, 0.0f, -6.0f); glScalef(fScale, fScale,fScale); Draw_Table(); glPopMatrix(); //更新因子 fTranslate += 0.005f; fRotate += 0.5f; fScale -= 0.005f; if(fTranslate > 0.5f) fTranslate = 0.0f; if (fScale < 0.5f)//縮小到一定程度之後變回原來大小 fScale = 1.0f; glutSwapBuffers(); } int main (int argc, char *argv[]) { glutInit(&argc, argv);//對glut函式庫進行初始化 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//指定glutCreateWindow函式將要建立的視窗顯示模式 RGB 雙緩衝 glutInitWindowSize(640,480);//視窗大小 glutCreateWindow("Exercise2");//開啟設定好的視窗,進入glutMainLoop之前這個視窗不會顯示 glutDisplayFunc(redraw);//指定當前視窗需要重繪時呼叫的函式 glutReshapeFunc(reshape);//註冊視窗大小改變時回撥函式 glutIdleFunc(idle); //可以執行連續動畫 glutMainLoop();//進入glut事件處理迴圈,永遠不會返回 return 0; }
實驗結果
其中左邊的桌子向上平移到一定的位置回到原位置繼續重複動作,中間的桌子繞y軸旋轉,右邊的桌子逐漸縮小到一定程度回到原大小繼續重複動作。
如有錯誤,請批評指正(*/ω╲*)
相關推薦
opengl繪製桌子(平移、旋轉、縮放)
主要儀器裝置 VisualStudio C++2015 Windows10環境 Glut壓縮包 Ex2工程 操作方法和實驗步驟 1.繪製立方體 桌子由立方體組成,我們可以通過繪製六個面來構造一個立方體。六個面的繪製需要八個頂點的引數,而每個頂點均有x,y,z三個引數,如
七、Sketchup用ruby進行二次開發--利用Transformation實現Move工具(平移、旋轉和縮放)
在Sketchup中,move工具使用的非常廣泛,,可以移動、拉伸和複製幾何體,也可以用來旋轉元件。舉一個簡單地例子。 我們要做一個建築物的尖頂,如下圖所示,就是使用move工具實現的。 接下來我們就要學習如何使用ruby實現這樣的功能
CABasicAnimation的使用方法(移動,旋轉,縮放)
設定動畫CABasicAnimation的屬性和說明 屬性 說明 duration 動畫的時間 repeatCount 重複的次數。不停重複設定為 HUGE_VALF repeatDuratio
Unity 移動端簡單手勢控制(移動,旋轉,縮放)
using UnityEngine; using System.Collections; using System.IO; /// <summary> /// 點選螢幕實現縮放與旋轉,移動 /// </summary> public cl
SVG 的平移、旋轉和縮放
SVG中的平移、旋轉和縮放在不同的引數條件下,體現出不同的效果: 1、如果直接用x、y指定了圖形的座標(在我的理解該座標實際是圖形相對座標,如果沒有通過transform屬性設定座標平移,該座標是相對畫布起始位置座標,如果設定了座標平移則為相對平移後坐標位置的偏移),所有的
openGL三維網格座標,旋轉,縮放,燈光設定,紋理讀取,模型讀取(MFC單文件)
1.三維網格座標建立 2.基本3維圖形建立 3.滑鼠相應旋轉縮放 4.鍵盤相應旋轉縮放 5.燈光設定 6.紋理載入對映 7.讀取模型 關於MFC配置編寫openGL網上有很多教程 需要的函式建立一般是: OnCreat()
canvas和白鷺引擎中平移,旋轉,縮放
都是 canvas 引擎 偏移 坐標 這一 text sla 偏移量 canvas中的 translate() 和白鷺引擎中的 .x 或者 .y 所導致的平移效果並不是移動 目標元素,而是移動目標元素父親所在的坐標系。 例如 bgg.translate(100,100)
矩陣運算——平移,旋轉,縮放
平時開發程式,免不了要對影象做各種變換處理。有的時候變換可能比較複雜,比如平移之後又旋轉,旋轉之後又平移,又縮放。 直接用公式計算,不但複雜,而且效率低下。這時可以藉助變換矩陣和矩陣乘法,將多個變換合成一個。 最後只要用一個矩陣對每個點做一次處理就可以得到想要的結果。
[CAAnimation核心動畫練習一]普通的平移,旋轉,縮放
#import "ViewController.h" @interface ViewController () { @private CALayer* _calyer; } @end @implementation ViewController - (vo
Android matrix偏移(平移),旋轉,縮放,傾斜的原理
第一部分 Matrix的數學原理 在Android中,如果你用Matrix進行過影象處理,那麼一定知道Matrix這個類。Android中的Matrix是一個3 x 3的矩陣,其內容如下: Matrix的對影象的處理可分為四類基本變換: Translate
Android OpenGLES2.0(十)——OpenGL中的平移、旋轉、縮放
在前面的部落格中,所有的例子都是一個物件,類似繪製圓錐繪製圓柱,我們都是傳入一個引數,然後去控制那個圓面的位置,如果我們要繪製幾個個正方形,它的位置、大小、方向都是不相同的,按照那種方式該多麻煩啊。所以我們需要更好的辦法——矩陣變換。 什麼是矩陣 其實在
4_圖片的裁剪、旋轉、平移、模糊(20181218)
圖片的裁剪、旋轉、放縮、平移、模糊(20181218) 1、圖片的裁剪 2、Tensorflow 中圖片的裁剪 2、圖片的旋轉 3、圖片的放縮 4、圖片的平移 5、圖片的模糊
vtkPolyData 的空間變換(平移、旋轉、縮放)
vtkPolydata的空間變化主要基於vtkTransform與vtkTransformPolyDataFilter兩個類實現,示例程式碼如下: vtkSmartPointer<vtkTr
檢視的平移、旋轉、縮放等操作(transform)
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from
OpenGL入門示例8——圖形平移、旋轉、縮放
#include<GL/glut.h> #include <windows.h> static GLfloat spin=0.0; //旋轉量 static GLfloat move=0.0; //平移量 static GLfloat
Android 繪圖基礎:Bitmap(點陣圖)與Matrix(矩陣)實現圖片5種操作(平移、旋轉、錯切、縮放、對稱)
Android的Matrix利用數學原理實現圖片平移、旋轉等操作詳解 很慶幸自己的線性代數學的還可以,理解Matrix的矩陣變換完全沒有問題。Matrix矩陣實現圖片的平移旋轉等操作涉及到線性代數問題,感興趣它的具體實現的話可以參考一下上面的部落格,非常詳
計算機圖形與OpenGL學習五(二維幾何變換1.平移、旋轉、縮放)
二維幾何變換(平移、旋轉、縮放)本章涉及數學變換比較多,程式碼是次要的,數學理論可自己推導一下。【二維平移】通過將二維量加到一個點的座標上來生成一個新的座標位置,可以實現一次平移。將平移距離加到原始座標上獲得一個新的座標,實現一個二維位置的平移。為平移向量,使用列向量來表示各
iOS transform(平移、旋轉、縮放)
一、平移 //平移 [UIView animateWithDuration:0.5 animations:^{ //使用Make,它是相對於最原始的位置做的形變. //self.imageV.tr
二維圖形學的變換-平移、旋轉、縮放 OpenGL
這裡實現的是多點畫多邊形,然後把這個多邊形進行二維的變換。 首先,多點畫多邊形,為了方便起見,我直接呼叫了Opengl的庫函式。其次,就是如何進行多邊形的二維變換。在這裡我有兩種方法。第一種是直接根據數學三角等公式推斷得到結果。第二種方法是用矩陣相乘的方法。 先講第一種:
Matlab 圖像平移、旋轉、縮放、鏡像
more msh ret 結果 src end 初始 求解 http 今天學習了用Matlab實現對圖像的基本操作。在Matlab中,圖像是按照二維矩陣的形式表示的。所以對圖像的操作就是對矩陣的操作。 對圖像進行縮放、平移、旋轉,都可以轉化為矩陣的運算。 關於變換矩陣的構