1. 程式人生 > >opengl繪製桌子(平移、旋轉、縮放)

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中,圖像是按照二維矩陣的形式表示的。所以對圖像的操作就是對矩陣的操作。 對圖像進行縮放、平移、旋轉,都可以轉化為矩陣的運算。 關於變換矩陣的構