內容簡介
計算機圖形學是利用計算機研究圖形的表示、生成、處理和顯示的一門重要的計算機學科分支,它是計算機科學中最活躍的分支之一。近年來,隨著計算機及網際網路技術的迅速發展,計算機圖形學正越來越深入我們的生活,它在工業建模、視頻處理、遊戲製作、影視特技、生物信息和醫藥醫療等各行各業都有著及其重要的作用。可以說,計算機圖形學的套用無所不在,且日益廣泛;已經成為計算機科學技術與其它套用學科之間溝通的橋樑,成為許多計算機從業人員的必備素質之一。
本書是一本國外很有影響的教材,為許多國外著名大學所採用。本書通過最能代表技術發展狀況的示例綜合介紹了計算機圖形學方面的原則和技巧,本書對每個概念都進行了詳細介紹,闡述了其背後的數學原理,並給出了用OpenGL實現的代碼以及實現結果展示。新版本還為讀者提供了計算機圖形學領域的最前沿信息。本書是計算機圖形學課程的很好教材,也是計算機圖形學專業人員的很好參考書。
圖書前言
本書原著在國外是很有影響力的教材,被許多國外著名的大學所採用。譯者在儘量保持原書精髓的基礎上,對原書做了一些表述上的調整,以符合中文習慣,原書中的一些筆誤,也給予了糾正。本書譯者中,胡事民、劉永進、張松海來自清華大學計算機科學與技術系,劉利剛來自浙江大學數學系,均在第一線從事計算機圖形學的教學和科研工作。在本書的翻譯中,胡事民教授負責第1、2、8章,劉利剛副教授負責10、11、12章,劉永進副教授負責5、6、7章,張松海博士負責3、4、9章。經過一年多的努力,本書終於完成翻譯,並付印。在翻譯過程中,得到了許多同事和學生的幫助,研究生徐昆、高岳、李勇、張硯、雷勵星、陳韜、張一飛、藏域、程明明、來煜坤、勒力、楊永亮、張國鑫、王王禹屏、邊哲、佟強、白石、沈超慧、盧少平、陳中貴、陳仁傑、陳軍、胡建偉、孟敏、張冬梅等參與翻譯了部分初稿,在此一併表示感謝。
由於譯者水平有限,本書翻譯過程中難有疏漏和不妥之處,敬請讀者批評和指正。前 言 對於有志於學習計算機圖形學基本原理和技術,並且渴望自己能夠編寫優質圖形學程式的讀者,本書為他們提供了入門的詳細介紹。計算機圖形學具有強大的生命力並正在持續發展。動畫電影已經展示給人們圖形學知識所能做到的令人激動的視覺效果。電腦遊戲和網際網路中的圖形效果同樣激勵人們去學習如何自己動手做出這樣的效果。
圖形軟硬體系統正在以驚人的速度朝著更好、更快和更廉價的方向發展。每年從研究和業界中提出的大量新技術不斷地湧現。然而,圖形學最基本的原理和方法,卻保持著穩定和連貫,並且這些知識中的大部分可以通過一個圖形學課程學習得到。本書將圖形學的一些基本思想和方法組織起來,通過閱讀使讀者從只會編寫簡單程式的水平,提高到能夠自行設計並編寫出優良圖形學程式的水平。
適用的讀者範圍
該書被設定為本科高年級或研究生一年級的一個或兩個學期的課程教材。該書也可用於自學。該書的主要對象是專業為計算機科學或計算機工程的學生,當然也適用於其他專業如物理和數學的學生。
對數學基礎的要求
讀者應該具備相當於大學一年級的數學水平;並具備初等代數、幾何、三角函式和初等微積分的基本知識。向量和矩陣的有關知識將有助於本書的閱讀,但不是必須的。本書在相關章節中介紹了向量和矩陣的基本知識,同時,附錄中總結了向量和矩陣的關鍵概念。
計算機圖形學中使用了大量的數學符號來表達線、面和視點之間的基本幾何關係。雖然每個數學符號都很容易理解,但所需的符號數量卻令人生畏。書中特彆強調了使用每種符號或技術的原因,以及如何利用這些數學符號合理地描述圖形程式中感興趣的對象。
對編程水平的要求
一般情況下,讀者應具有至少一個學期使用C、C++或Java編寫程式的經驗。相當多有關圖形的編程涉及到將幾何關係直接轉換為代碼,包括使用變數、函式、數組、循環和條件測試等,而這些東西在不同程式語言中都是類似的。本書使用的程式語言是C++,但是,有C語言背景的讀者可以輕易地讀懂大部分材料。
讀者如果熟練掌握C中的結構或C++中的類,將非常有助於本書的閱讀。如用於描述複雜場景的圖形對象結構,這些場景(如一個城堡或一架飛機)可能由許多部分組成,而這些部分本身又由複雜的更小部分組成。如果能熟練使用鍊表或樹結構也會有一些幫助,但不是必須的。
對於只懂得C但不懂得C++的讀者來說,需要掌握面向對象的編程理念。本書中定義了許多有用的類(如格線、場景、相機和紋理等類),並且說明了這些類為什麼方便易用。在某些場合下,為了使程式更加清晰易讀,我們使用了面向對象編程中的一些技術,如繼承和多態,不過,我們並不過分強調面向對象的方法。
計算機圖形學 (OpenGL版)(第3版)前言教學理念
第3版與前兩版相比,幾乎被完全重新組織和改寫,但是基本的教學理念沒有改變: 我們堅信計算機圖形學是在實際使用中學習到的,一定要動手編寫程式並進行測試,才能真正地掌握計算機圖形學。本書的一個主要目標就是讓讀者懂得如何將一個特定的設計任務轉換成相應的幾何結構,並找到一個合適的數學表達,最後將這個表達轉換為算法和程式代碼。本書將以循序漸進的方式讓讀者首先學習到如何編寫簡單的程式來繪製簡單的圖像,然後一步一步深入地掌握如何生成更加複雜的特殊效果的技巧。
練習和問題
本書包含超過350道來源於實際問題的練習題。其中大部分都是讓讀者停下來進行思考但並不需要編程的那種類型,這可以讓讀者自己測試一下知識掌握的程度。其餘小部分則需要編程實現。
此外,在所有章節的末尾,列出了總共超過50個的實例分析。它們都是一些編程的項目,難易程度由簡到繁,適合於作為課後作業。這些案例分析對相應章節內的內容進行了擴展。無論是否全部完成這些實例分析任務,它們都應該作為相應章節的一個有機組成部分。
每一個實例分析任務都註明了相應的難易程度,用以判斷完成該任務所需的大致時間。學生編程能力各異,編程過程不可預測,但可大致總結如下。
難易程度
I. 簡單的練習,應該可以一晚完成。
II. 較難任務,應該可以一周內完成,讀者需要一定的時間來設計程式,並且有足夠的時間反覆測試和調試程式。
III. 複雜任務,一般需要3周時間來完成設計和實現。完成它可以被視為一項重大進步。
OpenGL的使用
剛開始學習計算機圖形學時,一個很大的障礙就是如何繪製一幅圖像。寫一個程式通常很簡單,但最終要通過某些工具在螢幕上繪製出來。現在,這些工具已經存在並且很容易獲取。1992年, Silicon Graphics 公司推出了OpenGL。現在它已經成為最廣泛使用的圖形套用編程接口(API)之一。OpenGL通過提供可以在程式中調用的方法接口來繪製圖像,並且它可以在網際網路上免費下載。正如附錄1中所述,在大專院校和工業界中使用的各種計算機系統上,都可以使用OpenGL。它易於安裝和使用,目前作為標準的圖形API已經成熟。它的制定和修改由OpenGL評審委員會(一個負責引導OpenGL發展的工業協會)負責。
OpenGL非常適用於計算機圖形的一個特殊原因是因為它的設備獨立性或可移植性。不同院校的機房使用不同種類的計算機,學生可以利用OpenGL在任何一台計算機上開發並運行程式。此外,該程式也可以在不同作業系統下、不同類型的另一台計算機上運行,兩台計算機上生成的圖像也一定相同。
OpenGL提供了豐富且易用的二維圖形和圖像操作的API函式,然而OpenGL最強大之處在於處理三維圖形。使用OpenGL,讀者可以在一個學期之內學習並掌握製作精美動畫效果的技巧。
OpenGL的發展歷史
OpenGL的第一個版本1.0在1992年發布。從那時起, OpenGL一直都是一個成功的跨平台的圖形API。第一個版本可以很好地兼容一個叫做IrisGL的專有API,這種API是由Silicon Graphics公司設計開發的。兼容的目的是為了建立一個工業標準。為此,Silicon Graphics公司聯合其他幾家圖形硬體公司,共同制定了一個開放標準,命名為OpenGL。不足為奇,在隨後的10年,人們努力使得OpenGL變得更好和更加強大。在這段時間,圖形硬體也發展迅猛,產生了越來越強大的圖形加速卡,這使得程式開發者迫切需要一個能夠達到OpenGL最佳效果的API。因此,OpenGL提供了一系列的擴展函式,允許開發者在圖形硬體新特徵出現後就可以馬上充分利用它們。
每當有一種強大的軟體系統面世,標準的問題也隨即產生。對於OpenGL,為使它朝著可控、有序的方向發展,Silicon Graphics成立了一個監督組織,該組織被稱作OpenGL 架構評審委員會(Architecture Review Board, ARB). ARB的主要任務是指導OpenGL規範的制定和一致性測試。OpenGL規範詳盡地描述了每個OpenGL方法和標識符的使用方法。目前,ARB的成員有3Dlabs、蘋果公司、IBM、英特爾、nVidia、ATI、SGI和Sun Microsystems等。
OpenGL規範中定義的方法由各個圖形硬體廠商在圖形驅動程式中實現。這個過程需要大量的資金和時間,所以,通常在規範發布後過一段時間,支持該規範的驅動程式才會發布。最新的版本OpenGL 2.0在2004年9月發布,它包含了強大的OpenGL著色語言(Shading Language),將在第8章對此進行詳細介紹。它的前一版本是OpenGL 1.5,該版本發布於2003年。
計算機圖形學是一個發展迅速的領域,這使得開發人員往往很急切地等待OpenGL官方版本的發布。所以,必須存在一種機制,使得小規模增加的最新OpenGL功能可以馬上在最新的圖形硬體上開發和測試。為此,ARB提供了一個明確定義的擴展機制。在OpenGL擴展註冊表中可以看到擴展的列表,其中定義了命名習慣,新擴展的指導方針和其他相關的擴展討論。訪問擴展是一個平台相關的任務,而可用的擴展取決於計算機上安裝的圖形硬體。一些庫如GLEW和GLEE可以用來簡化在應用程式中使用擴展。
擴展機制使得OpenGL以一個合理的成本運行。小規模的改動就可以擁有最新硬體的強大功能。這些擴展一旦被批准並在OpenGL擴展註冊表中註冊登記之後,即可以迅速發揮作用。當某個擴展已經成熟到可以加入OpenGL的核心功能中時,ARB就會討論決定是否將其加入,然後發布新版本的OpenGL。這些內容將在第8章中進行討論。
C++程式語言的使用
C++是大多數工程和計算機科學專業的首選程式語言。相比於C, C++有幾個明顯的優點,如引用傳遞函式參數,這使得顯式指針不再需要,代碼閱讀更加易懂。通過使用流,檔案的輸入輸出(I/O)也被極大地簡化。一般來說,C++中的所有I/O的語法都比C中更為清晰。為了使得本書中的描述更為簡單,我們沒有特彆強調C++中運算符的使用。
此外,C++中的類很容易開發套用,如二維或三維中的點、線、視窗或顏色,這使代碼更加簡單而且更加魯棒。使用類之後,具體的操作如幾何對象細節隱藏、編寫繪製函式包裝繪製、測試某個對象是否相交等都更加清晰易讀。
注重三維計算機圖形學
由於PC上的遊戲越來越流行,電影中令人眼花繚亂的動畫越來越多,學生都對開發三維互動式的圖形應用程式特別有興趣。為了能讓讀者更快地進入三維圖形學的主題,本書重新組織了第一版和第二版中的若干章節。在很多地方,二維和三維的概念結合在一起論述,這可以幫助理解兩者之間的相似和區別。
使用場景設計語言來描述三維場景
如果用原始的OpenGL命令來描述一個包含很多三維物體的場景,將會非常不雅觀而且費時。例如,如果使用OpenGL的命令逐一定義6個面來描述一個立方體將顯得非常乏味。所以,在第5章中會介紹一個簡單的場景描述語言SDL(在附錄中有更加詳盡定義)。使用這個描述語言,學生可以使用熟悉的辭彙來描述場景,如“立方體”、“球”和“旋轉”等,並建立包含這些辭彙的檔案。這些檔案可以在運行時讀入到程式中。本書的附錄(或本書的網站)中給出了一個能夠閱讀SDL檔案並建立檔案中所描述物體的解釋程式。這樣,用OpenGL來繪製場景檔案中的物體列表就變得非常簡單。
本書的結構和課程安排
本書包含多於一個學期的教學內容,甚至多於兩個學期的內容(對前兩版也是這種情況)。本書經過細緻的編排,使得授課老師可以根據課程的長度和課程的背景選擇不同的章節組合來授課。下面在介紹完各章的主要內容之後,將介紹幾個建議的章節組合教學方案。
圖書目錄
第1章 計算機圖形學基礎
>第2章 使用OpenGL的圖像生成
>第3章 更多的畫圖工具
>第4章 圖形學的矢量工具
>第5章 物體的幾何變換
>第6章 用多邊形格線建模
>第7章 三維的觀察
>第8章 基於OpenGL的真實感繪製
>第9章 光柵顯示的工具
>第10章 曲線和曲面的設計
>第11章 顏色理論
>第12章 光線跟蹤算法基礎
>附錄1 圖形工具箱 — 如何獲取和安裝OpenGL
>附錄2 計算機圖形學的數學基礎
>附錄3 SDL簡介: 場景描述語言
>附錄4 分形和Mandelbrot集合
>附錄5