Modeling 靜宜大學資工系 蔡奇偉副教授. 大綱  何謂多邊形?  多邊形的種類  多邊形的正面與反面  填滿多邊形  OpenGL 多邊形相關函式  範例.

Slides:



Advertisements
Similar presentations
Chapter 10 馬可夫鏈 緒言 如果讀者仔細觀察日常生活中所發生的 諸多事件,必然會發現有些事件的未來 發展或演變與該事件現階段的狀況全然 無關,這種事件稱為獨立試行過程 (process of independent trials) ;而另一些 事件則會受到該事件現階段的狀況影響。
Advertisements

布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
: A-Sequence 星級 : ★★☆☆☆ 題組: Online-judge.uva.es PROBLEM SET Volume CIX 題號: Problem D : A-Sequence 解題者:薛祖淵 解題日期: 2006 年 2 月 21 日 題意:一開始先輸入一個.
:Word Morphing ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10508:word morphing 解題者:楊家豪 解題日期: 2006 年 5 月 21 日 題意: 第一行給你兩個正整數, 第一個代表下面會出現幾個字串,
指導教授:陳淑媛 學生:李宗叡 李卿輔.  利用下列三種方法 (Edge Detection 、 Local Binary Pattern 、 Structured Local Edge Pattern) 來判斷是否為場景變換,以方便使用者來 找出所要的片段。
1.1 線性方程式系統簡介 1.2 高斯消去法與高斯-喬登消去法 1.3 線性方程式系統的應用(-Skip-)
Review of Chapter 3 - 已學過的 rules( 回顧 )- 朝陽科技大學 資訊管理系 李麗華 教授.
Graph V(G 1 )={0, 1, 2, 3, 4, 5, 6, 7, 8, 9} E(G 1 )={(0, 2), (0, 3), (1, 4), (2, 3), (2, 5), (2, 6), (3, 6), (3, 7), (4, 7), (5, 6), (5,
: OPENING DOORS ? 題組: Problem Set Archive with Online Judge 題號: 10606: OPENING DOORS 解題者:侯沛彣 解題日期: 2006 年 6 月 11 日 題意: - 某間學校有 N 個學生,每個學生都有自己的衣物櫃.
Chapter 2 聯立線性方程式與矩陣 緒言 線性方程式組 (systems of linear equations) 出現 在多數線性模式 (linear model) 中。根據以往解 題的經驗,讀者們也許已發現方程式的解僅與 該方程式的係數有關,求解的過程也僅與係數 的運算有關,只要係數間的相關位置不改變,
Chapter 3 Growth of Functions Asymptotic notation Θ-notation: f(n) = Θ(g(n)) , g(n) is an asymptotically tight bound for f(n) 。 Θ(g(n)) = {f(n)|
5.1 Rn上之長度與點積 5.2 內積空間 5.3 單範正交基底:Gram-Schmidt過程 5.4 數學模型與最小平方分析
第 4 章 迴歸的同步推論與其他主題.
JAVA 程式設計與資料結構 第十四章 Linked List. Introduction Linked List 的結構就是將物件排成一列, 有點像是 Array ,但是我們卻無法直接經 由 index 得到其中的物件 在 Linked List 中,每一個點我們稱之為 node ,第一個 node.
MATLAB 程式設計 第 11 章 多維陣列 多維陣列的定義 在 MATLAB 的資料型態中,向量可視為 一維陣列,矩陣可視二維陣列,對於維 度 (Dimensions) 超過 1 的陣列則均可視 為「多維陣列」 (Multidimesional Arrays , 簡稱 N-D Arrays)
8.1 何謂高度平衡二元搜尋樹 8.2 高度平衡二元搜尋樹的加入 8.3 高度平衡二元搜尋樹的刪除
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
Monte Carlo Simulation Part.2 Metropolis Algorithm Dept. Phys. Tunghai Univ. Numerical Methods C. T. Shih.
JAVA 程式設計與資料結構 第十章 GUI Introdution III. File Chooser  File Chooser 是一個選擇檔案的圖形介面, 無論我們是要存檔還是要開啟檔案,使 用這個物件都會讓我們覺得容易且舒適。
桁架分析.
1 第四章 多變數函數的微分學 § 4.1 偏導數定義 定義 極限值 ■. 2 定理 極限值的基本定理 (1) 極限值的唯一性 : 若 存在,則 其值必為唯一。 (2) 若 且 ( 與 為常數 ) , 則 且 為常數且.
Network Connections ★★★☆☆ 題組: Contest Archive with Online Judge 題號: Network Connections 解題者:蔡宗翰 解題日期: 2008 年 10 月 20 日 題意:給你電腦之間互相連線的狀況後,題.
Chapter 13 塑模靜態觀點:物件圖 Static View : Object Diagram.
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
: The largest Clique ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11324: The largest Clique 解題者:李重儀 解題日期: 2008 年 11 月 24 日 題意: 簡單來說,給你一個 directed.
3-3 使用幾何繪圖工具 Flash 的幾何繪圖工具包括線段工具 (Line Tool) 、橢圓形工具 (Oval Tool) 、多邊星形 工具 (Rectangle Tool) 3 種。這些工具畫出 來的幾何圖形包括了筆畫線條和填色區域, 將它們適當地組合加上有技巧地變形與配 色, 不但比鉛筆工具簡單,
: Tight words ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: : Tight Words 解題者:鐘緯駿、林一帆 解題日期: 2006 年 03 月 14 日 題意: 給定數字 k 與 n (0 ≦ k.
圖層的操作與管理 圖層的作用就如同一張張透明的賽璐璐片, 你可以將動畫中的每項物件, 放置在不同圖 層中, 圖層交疊就形成完整的畫面。在各圖 層中的物件, 做任何的移動或變化, 都不會 相互干擾, 所以當你編輯一個物件時, 只要 在物件所在的圖層進行操作, 將可大幅降低 製作過程的複雜度與難度。
: Fast and Easy Data Compressor ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10043: Fast and Easy Data Compressor 解題者:葉貫中 解題日期: 2007 年 3.
3.1 矩陣的行列式 3.2 使用基本運算求行列式 3.3 行列式的性質 3.4 特徵值介紹 3.5 行列式的應用
Fourier Series. Jean Baptiste Joseph Fourier (French)(1763~1830)
: Problem A : MiniMice ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11411: Problem A : MiniMice 解題者:李重儀 解題日期: 2008 年 9 月 3 日 題意:簡單的說,題目中每一隻老鼠有一個編號.
結構學(一) 第七次作業 97/05/15.
: Multisets and Sequences ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11023: Multisets and Sequences 解題者:葉貫中 解題日期: 2007 年 4 月 24 日 題意:在這個題目中,我們要定義.
: Placing Lampposts ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10859: Placing Lampposts 解題者:陳志瑜 解題日期: 2011 年 5 月 10 日 題意:美化為 Dhaka City.
資料結構實習-一 參數傳遞.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
觀測量的權 權的觀念與計算.
: Problem G e-Coins ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10306: Problem G e-Coins 解題者:陳瀅文 解題日期: 2006 年 5 月 2 日 題意:給定一個正整數 S (0
: Beautiful Numbers ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11472: Beautiful Numbers 解題者:邱經達 解題日期: 2011 年 5 月 5 日 題意: 若一個 N 進位的數用到該.
第 9 章 TSR 程式基本教練. 本章提要 TSR 程式 以熱鍵 (Hot key) 叫用 TSR 程式 Clock 中斷 int 08h 、 int 1ch DOS reentrant 的問題 有用的 TSR 程式.
Section 4.2 Probability Models 機率模式. 由實驗看機率 實驗前先列出所有可能的實驗結果。 – 擲銅板:正面或反面。 – 擲骰子: 1~6 點。 – 擲骰子兩顆: (1,1),(1,2),(1,3),… 等 36 種。 決定每一個可能的實驗結果發生機率。 – 實驗後所有的實驗結果整理得到。
函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈, 無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以 達到部分迴圈的效果.
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
Chapter 6 線性規劃 緒言 如何在有限的經濟資源下進行最有效的調配與 選用,以求發揮資源的最高效能。此問題愈來 愈受到重視,也就是以最低的代價,獲取最大 的效益。 茲列舉如下: – 決定緊急設備與人員的地點,使反應時間最短化。 – 決定飛機、飛行員、地勤人員的飛航最佳日程安排。
-Antidifferentiation- Chapter 6 朝陽科技大學 資訊管理系 李麗華 教授.
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
Chapter 2. Recurrence Relations (遞迴關係)
介紹不同坐標系之間的轉換 以LS平差方式求解坐標轉換參數
Structural Equation Modeling Chapter 6 CFA 根據每個因素有多重指標,以減少 測量誤差並可建立問卷的構念效度 驗證性因素分析.
第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員.
Chapter 10 m-way 搜尋樹與B-Tree
第五章 內積空間 5.1 Rn上之長度與點積 5.2 內積空間 5.3 單範正交基底:Gram-Schmidt過程
: Help My Brother ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11033: Help My Brother 解題者: 呂明璁 解題日期: 2007 年 5 月 14 日.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
2005/7 Linear system-1 The Linear Equation System and Eliminations.
連續隨機變數 連續變數:時間、分數、重量、……
第 5 章 選擇控制項與條件敘述 5-1 結構化程式設計 5-1 結構化程式設計 5-2 關係與邏輯運算子 5-2 關係與邏輯運算子 5-3 簡單的條件敘述 5-3 簡單的條件敘述 5-4 選擇控制項 5-4 選擇控制項 5-5 巢狀條件敘述 5-5 巢狀條件敘述 5-6 多選一條件敘述 5-6 多選一條件敘述.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
Microsoft Excel.
: Finding Paths in Grid ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11486: Finding Paths in Grid 解題者:李重儀 解題日期: 2008 年 10 月 14 日 題意:給一個 7 個 column.
:Problem E.Stone Game ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10165: Problem E.Stone Game 解題者:李濟宇 解題日期: 2006 年 3 月 26 日 題意: Jack 與 Jim.
幼兒行為觀察與記錄 第八章 事件取樣法.
結構學 ( 一 ) 第八次作業 97/05/22. 題目一 題目一 (a) 先決定放鬆哪個束制,成為靜定結構 以支承 C 之水平反力為贅力,則 C 點滾支 承變成自由端,即形成靜定基元結構 C 點滿足變位諧和  Δ CH =0.
CH 14-可靠度工程之數學基礎 探討重點 失效時間之機率分配 指數模式之可靠度工程.
: How many 0's? ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11038: How many 0’s? 解題者:楊鵬宇 解題日期: 2007 年 5 月 15 日 題意:寫下題目給的 m 與 n(m
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
1 柱體與錐體 1. 找出柱體與錐體的規則 2. 柱體的命名與特性 3. 柱體的展開圖 4. 錐體的命名與特性 5. 錐體的展開圖
Vertex Array Objects & Buffer Objects
Presentation transcript:

Modeling 靜宜大學資工系 蔡奇偉副教授

大綱  何謂多邊形?  多邊形的種類  多邊形的正面與反面  填滿多邊形  OpenGL 多邊形相關函式  範例

何謂多邊形? n 邊的多邊形( polygon )是由 n 個共平面的端點 v 1, v 2, …, v n 和 n 條邊線 (v 1, v 2 ) , (v 2, v 3 ), …, (v n-1, v n ), (v n, v 1 ) 所組成。 v1v1 v2v2 v3v3 v1v1 v2v2 v3v3 v4v4 v1v1 v2v2 v3v3 v4v4 v5v5 v6v6 v7v7 v1v1 v2v2 v3v3 v4v4 v5v5

多邊形的種類 簡單多邊形( simple polygon ) 邊線都不相交而且沒有洞的多邊形。又可分成: 凸多邊形( convex polygon ) 假定 a 和 b 是多邊形中任意的兩點。線段 ab 上所有 的點也都在多邊形中。 凹多邊形( concave polygon ) 不是凸的簡單多邊形即為凹多邊形。 非簡單多邊形( non-simple polygon ) 邊線相交或有洞的多邊形。

凸多邊形 凹多邊形 非簡單的多邊形

多邊形的正面與反面 在三度空間中,多邊形有正反兩面。通常我們把端點順序符合 逆時針方向的那一面稱為正面,另一面稱為反面。 v1v1 v2v2 v3v3 v4v4

OpenGL 多邊形相關函式  glRect*()  glPolygonMode()  glFrontFace()  glCullFace()

glRect{sifd} (TYPE x1, TYPE y1, TYPE x2, TYPE y2) 在 z = 0 的平面上,畫一個以 (x1, y1) 和 (x2, y2) 為對角端 點的矩形。 (x1, y1) (x2, y2)(x1, y1) (x2, y2) glRect{sifd}v (TYPE *v1, TYPE *v2) v1: 用來存第一個端點的陣列 v2: 用來存第二個端點的陣列

glBegin( type ) /* 一連串的 glVertex*() 呼叫 */ glEnd() 參數 type 可以是下面的常數值: GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP GL_POLYGON

glPolygonMode (GLenum face, GLenum mode ) 控制多邊形的繪製的方式。 參數 face 設定繪製多邊形的正面或反面,其值為: GL_FRONT_AND_BACK 正反面都畫 參數 mode 設定繪製的模式,其值可為: GL_FILL 填滿多邊形內部(此為預設的模式) GL_LINE 只畫多邊形的框線 GL_POINT 只畫多邊形的端點

glFrontFace (GLenum mode ) 設定多邊形正面的決定方式。 參數 mode 設定正面的方向,其值可為: GL_CCW 逆時針方向為正面(此為預設值) GL_CW 順時針方向為正面 v3v3 v4v4 v1v1 v2v2 GL_CCW v3v3 v4v4 v1v1 v2v2 GL_CW

glCullFace (GLenum mode ) 設定多邊形那一個面被剔除( cull )。 參數 mode 選擇那一面被剔除,其值可為: GL_FRONT 正面 GL_BACK 反面 GL_FRONT_AND_BACK 正面和反面 呼叫此函式之前,你必須已經呼叫 glEnable(GL_CULL_FACE) 來啟動此 OpenGL 的剔除功能。 若要關閉此功能,則可呼叫: glDisable(GL_CULL_FACE)

範例: cube 繪製方法(使用 triangles ) vertex list front back void make_cube_vertices ( GLfloat size ) { GLfloat half_size = size / 2.0f; vertexList[0] = vec3(-half_size, -half_size, half_size); vertexList[1] = vec3(-half_size, -half_size, -half_size); vertexList[2] = vec3(-half_size, half_size, -half_size); vertexList[3] = vec3(-half_size, half_size, half_size); vertexList[4] = vec3( half_size, -half_size, half_size); vertexList[5] = vec3( half_size, -half_size, -half_size); vertexList[6] = vec3( half_size, half_size, -half_size); vertexList[7] = vec3( half_size, half_size, half_size); } x z y

front back void draw_cube01 (void) { vec3 tv[36]; // vertices of triangles tv[0] = vertexList[2]; tv[1] = vertexList[3]; tv[2] = vertexList[7]; tv[3] = vertexList[7]; tv[4] = vertexList[6]; tv[5] = vertexList[2]; tv[30] = vertexList[4]; tv[31] = vertexList[0]; tv[32] = vertexList[5]; tv[33] = vertexList[0]; tv[34] = vertexList[1]; tv[35] = vertexList[5]; glBufferData( GL_ARRAY_BUFFER, 36*sizeof(vec3), tv, GL_STATIC_DRAW ); glVertexAttribPointer( loc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); glDrawArrays( GL_TRIANGLES, 0, 36 ); }

Triangle Strips with Winding Order Triangle strips do face culling differently. For every second triangle, the one who's winding order is opposite from the first triangle's order, the winding order is considered backwards for culling purposes. So if you have set the front face to be clockwise, and have face culling cull back-facing triangles, everything will work exactly as you expect so long as the order of the first triangle is correct. Every even numbered triangle will be culled if it has a clockwise winding, and every odd numbered triangle will be culled if it has a counter-clockwise winding.

範例: cube 繪製方法(使用 triangle strips ) void draw_cube02 (void) { vec3 tv[18]; // vertices of triangles tv[0] = vertexList[3]; tv[1] = vertexList[0]; tv[2] = vertexList[7]; tv[3] = vertexList[4]; tv[4] = vertexList[6]; tv[5] = vertexList[5]; tv[6] = vertexList[2]; tv[7] = vertexList[1]; tv[8] = vertexList[3]; tv[9] = vertexList[0]; tv[10] = vertexList[2]; tv[11] = vertexList[3]; tv[12] = vertexList[6]; tv[13] = vertexList[7]; tv[14] = vertexList[0];tv[15] = vertexList[1]; tv[16] = vertexList[4]; tv[17] = vertexList[5]; glBufferData( GL_ARRAY_BUFFER, 18*sizeof(vec3), tv, GL_STATIC_DRAW ); glVertexAttribPointer( loc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); glDrawArrays( GL_TRIANGLE_STRIP, 0, 10 ); glDrawArrays( GL_TRIANGLE_STRIP, 10, 4 ); glDrawArrays( GL_TRIANGLE_STRIP, 14, 4 ); }

Draw Elements  glDrawElements()  glMultiDrawElements()  glDrawRangeElements()

vertex arrays index array

範例: cube 繪製方法(使用 elements ) GLuint buffer[2];// Buffer object ID’s enum {VERTEX_ARRAY, ELEMENT_ARRAY}; glGenBuffers( 2, buffer ); glBindBuffer( GL_ARRAY_BUFFER, buffer[VERTEX_ARRAY] ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, buffer[ELEMENT_ARRAY] ); 建立 Buffer Objects

void draw_cube (void) { GLushort idx[18] = { 3, 0, 7, 4, 6, 5, 2, 1, 3, 0, 2, 3, 6, 7, 0, 1, 4, 5 }; glBufferData( GL_ARRAY_BUFFER, 8*sizeof(vec3), vertexList, GL_STATIC_DRAW ); glVertexAttribPointer( loc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); glBufferData( GL_ELEMENT_ARRAY_BUFFER, 18*sizeof(GLushort), idx, GL_STATIC_DRAW ); glDrawElements( GL_TRIANGLE_STRIP, 10, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); glDrawElements( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, BUFFER_OFFSET(10*sizeof(GLushort))); glDrawElements( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, BUFFER_OFFSET(14*sizeof(GLushort))); }

void make_sphere_vertices ( GLdouble radius, GLint slices, GLint stacks) { nVertices = slices * (stacks - 1) + 2; // two poles vertexList = new vec3[nVertices]; vertexList[0] = vec3(0.0f, radius, 0.0f); GLdouble ds = 2 * radius / stacks; GLdouble yval = radius, dtheta = 2.0 * M_PI / slices; int k = 1; for (int i = 1; i < stacks; i++) { yval -= ds; GLdouble r = std::sqrt(radius*radius - yval*yval); GLdouble ang = 0.0; for (int j = 0; j < slices; j++) { vertexList[k] = vec3(r*std::cos(ang), yval, r*std::sin(ang)); k++; ang += dtheta; } vertexList[k] = vec3(0.0f, -radius, 0.0f); } 範例: Sphere 繪製方法

glBufferData( GL_ARRAY_BUFFER, nVertices*sizeof(vec3), vertexList, GL_STATIC_DRAW ); glVertexAttribPointer( loc, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );

// North pole nv = nSlices+2; // number of vertices idx[0] = 0; for (i = 1; i <= nSlices; i++) idx[i] = i; idx[i] = 1; glBufferData( GL_ELEMENT_ARRAY_BUFFER, nv*sizeof(GLushort), idx, GL_STATIC_DRAW ); glDrawElements( GL_TRIANGLE_FAN, nv, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));

// inside stacks nv = 2*nSlices+2; // number of vertices for (int k = 1; k < nStacks - 1; k++) { int k1 = nSlices * (k -1) + 1; int k2 = nSlices * k + 1; for (int j = 0; j < 2*nSlices; j+=2) { idx[j] = k1++; idx[j+1] = k2++; } idx[nv-2] = idx[0]; idx[nv-1] = idx[1]; glBufferData( GL_ELEMENT_ARRAY_BUFFER, nv*sizeof(GLushort), idx, GL_STATIC_DRAW ); glDrawElements( GL_TRIANGLE_STRIP, nv, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); }

// South pole nv = nSlices+2; // number of vertices idx[0] = nVertices - 1; for (i = 1; i <= nSlices; i++) idx[i] = nVertices - nSlices i; idx[i] = nVertices - nSlices - 1; glBufferData( GL_ELEMENT_ARRAY_BUFFER, nv*sizeof(GLushort), idx, GL_STATIC_DRAW ); glDrawElements( GL_TRIANGLE_FAN, nv, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); vertex list nVertices – 1 – nSlicesnVertices – 1

Hidden-Line Removal with Polygon Offset glEnable(GL_DEPTH_TEST); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); set_color(foreground); draw_object_with_filled_polygons(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 1.0); set_color(background); draw_object_with_filled_polygons(); glDisable(GL_POLYGON_OFFSET_FILL);

範例: Icosahedron 繪製方法 #define X #define Z void make_icosahedron_vertices ( GLdouble radius) { vdata[0] = radius * vec3(-X, 0.0, Z); vdata[1] = radius * vec3(X, 0.0, Z); vdata[2] = radius * vec3(-X, 0.0, -Z); vdata[3] = radius * vec3(X, 0.0, -Z); vdata[4] = radius * vec3(0.0, Z, X); vdata[5] = radius * vec3(0.0, Z, -X); vdata[6] = radius * vec3(0.0, -Z, X); vdata[7] = radius * vec3(0.0, -Z, -X); vdata[8] = radius * vec3(Z, X, 0.0); vdata[9] = radius * vec3(-Z, X, 0.0); vdata[10] = radius * vec3(Z, -X, 0.0); vdata[11] = radius * vec3(-Z, -X, 0.0); } GLushort tindices[20][3] = { {1,4,0}, {4,9,0}, {4,5,9}, {8,5,4}, {1,8,4}, {1,10,8}, {10,3,8}, {8,3,5}, {3,2,5}, {3,7,2}, {3,10,7}, {10,6,7}, {6,11,7}, {6,0,11}, {6,1,0}, {10,1,6}, {11,0,9}, {2,11,9}, {5,2,9}, {11,2,7} };

範例: Sphere 繪製方法( subdivision ) Icosahedron

void subdivide(vec3 v1, vec3 v2, vec3 v3) { vec3 v12, v23, v31; GLint i; v12 = (v1+v2)/2.0; v23 = (v2+v3)/2.0; v31 = (v3+v1)/2.0; // 映射至球面上 v12 = radius * normalize(v12); v23 = radius * normalize(v23); v31 = radius * normalize(v31); drawtriangle(v1, v12, v31); drawtriangle(v2, v23, v12); drawtriangle(v3, v31, v23); drawtriangle(v12, v23, v31); } v1 v2 v3 v12 v23 v31

void subdivide(vec3 v1, vec3 v2, vec3 v3, int depth) { GLfloat v12, v23, v31; GLint i; if (depth == 0) { drawtriangle(v1, v2, v3); return; } v12 = (v1+v2)/2.0; v23 = (v2+v3)/2.0; v31 = (v3+v1)/2.0; // 映射至球面上 v12 = radius * normalize(v12); v23 = radius * normalize(v23); v31 = radius * normalize(v31); subdivide(v1, v12, v31, depth-1); subdivide(v2, v23, v12, depth-1); subdivide(v3, v31, v23, depth-1); subdivide(v12, v23, v31, depth-1); } v1 v2 v3 v12 v23 v31 Recursive Subdivision

參考資料 1. OpenGL Programming Guide, 7E Version 3.0 and 3.1 (2010) 2. OpenGL Shading Language 3rd Edition (2010)