若是要獲得pose視圖,除非有精密的測量方法,不然進行大量的樣本採集時很耗時耗力的。能夠採起一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,能夠利用已獲得的3D模型,利用投影的方法 (page10-透視投影或者正射投影),自動獲得精確的3D單向視圖。html
其中的遇到了好幾個難題:透視投影的視角問題;單側面的曲面補全問題(曲面插值問題);pose特徵的描述性問題。git
一篇文章看完視覺及相關通略。
程序員
先普及一下基礎知識:算法
一:圖像處理、計算機圖形學、計算機視覺和模式識別領域的區別和聯繫編程
三者之間既有區別,又有聯繫。 原文連接:http://blog.csdn.net/qianmianyuan/article/details/9130805數組
計算機圖形學是給定關於景象結構、表面反射特性、光源配置及相機模型的信息,生成圖像。 而計算機視覺是給定圖象,推斷景象特性實現的是從模型到圖像的變換,也就是說從圖象數據提取信息,包括景象的三維結構,運動檢測,識別物體等。 模式識別則是從特徵空間到類別空間的變換。研究內容包括特徵提取( PCA,LDA,LFA,Kernel,總之,計算機圖形學是計算機視覺的逆問題,二者從最初相互獨立的平行發展到最近的融合是一大趨勢。圖像模式的分類是計算機視覺中的一個重要問題,模式識別中的許多方法能夠應用於計算機視覺中。緩存
圖形學講的是圖形,也就是圖形的構造方式,是一種從無到有的概念,從數據獲得圖像。數字圖像處理是對已有的圖像進行變換、分析、重構,獲得的還是圖像。PR本質就是分類,根據常識或樣本或兩者結合進行分類,能夠對圖像進行分類,從圖像獲得數據。服務器
Computer Graphics和Computer Vision是同一過程的兩個方向。Computer Graphics將抽象的語義信息轉化成圖像,Computer Vision從圖像中提取抽象的語義信息。Image Processing探索的是從一個圖像或者一組圖像之間的互相轉化和關係,與語義信息無關。
網絡
先說區別:
Computer Graphics,簡稱 CG 。輸入的是對虛擬場景的描述,一般爲多邊形數組,而每一個多邊形由三個頂點組成,每一個頂點包括三維座標、貼圖座標、rgb顏色等。輸出的是圖像,即二維像素數組。
Computer Vision,簡稱 CV。輸入的是圖像或圖像序列,一般來自相機或usb攝像頭。輸出的是對於圖像序列對應的真實世界的理解,好比檢測人臉、識別車牌。
Digital Image Processing,簡稱 DIP。輸入的是圖像,輸出的也是圖像。Photoshop中對一副圖像應用濾鏡就是典型的一種圖像處理。常見操做有模糊、灰度化、加強對比度等。併發
能夠簡單地理解爲:圖像學更側重於圖像的字母表和語法部分;而計算機視覺更側重於圖像從語法到語義的部分;而數字圖像處理側重於圖像的狀態空間轉化過程及總結其通常規律。
再說聯繫:
CG 中也會用到 DIP,現今的三維遊戲爲了增長表現力都會疊加全屏的後期特效,原理就是 DIP,只是將計算量放在了顯卡端。CV 更是大量依賴 DIP 來打雜活,好比對須要識別的照片進行預處理。最後還要提到近年來的熱點——加強現實(AR),它既須要 CG,又須要 CV,固然也不會漏掉 DIP。它用 DIP 進行預處理,用 CV 進行跟蹤物體的識別與姿態獲取,用 CG 進行虛擬三維物體的疊加。
簡單點說吧,1 計算機視覺,裏面人工智能的東西更多一些,不只僅是圖像處理的知識,還涵蓋了人工智能,機器學習等領域知識;2,計算機圖形學,主要涉及圖造成像及遊戲類開發,如opengl等,還有就是視頻渲染等;3,圖像處理,這個主要針對圖像圖像的基本處理,如圖像檢索或則圖像識別,壓縮,復原等等操做。以上只是本人字面理解
計算機圖形學和數字圖像處理是比較老的技術。計算機視覺要遲幾十年才提出。計算機圖形學和數字圖像處理的區別在於圖形和圖像。
圖形是矢量的、純數字式的。圖像經常由來自現實世界的信號產生,有時也包括圖形。而圖像和圖形都是數據的簡單堆積,計算機視覺要從圖像中整理出一些信息或統計數據,也就是說要對計算機圖像做進一步的分析。
以上是它們的區別,下面來講聯繫:
計算機圖形學的研究成果能夠用於產生數字圖像處理所須要的素材,計算機視覺須要以數字圖像處理做爲基礎。計算機視覺與數字圖像處理的這種關係相似於物理學和數學的關係。
你能夠多看看浙大周昆的文章,周昆是計算機圖形學這個領域的領軍人物另外,你若是不是浙江大學的或者中科院計算所的,不建議作這個方向,難度太大(圖形比圖像雖然表面上只高一維,但實際上工做量大了好多倍;其次,圖像,國內外差距目前已經很小,好發重要期刊;圖形,除上面兩個單位和微軟外,國內外差距很大,很差發重要期刊)
數字圖像處理主要是對已有的圖像,好比說可見光的圖像、紅外圖像、雷達成像進行噪聲濾除、邊緣檢測、圖像恢復等處理,就像用ps 處理照片同樣的。人臉識別啊、指紋識別啊、運動物體跟蹤啊,都屬於圖像處理。去噪有各類濾波算法;其餘的有各類時頻變化算法,如傅里葉變化,小波變換等,有不少這方面的書籍。
圖形學主要研究如何生成圖形的,像用autoCAD做圖,就是圖形學中算法的應用。各類動漫軟件中圖形算法的生成等。
二:數學的三大核心領域:數學的三大核心領域——代數學、幾何學、分析學
原文連接:http://blog.sciencenet.cn/blog-81613-682181.html
數學發展到如今,已經成爲科學世界中擁有100多個主要分支學科的龐大的「共和國」。大致說來,數學中研究數的部分屬於代數學的範疇;研究形的部分,屬於幾何學的範籌;溝通形與數且涉及極限運算的部分,屬於分析學的範圍。這三大類數學構成了整個數學的本體與核心。在這一核心的周圍,因爲數學經過數與形這兩個概念,與其它科學互相滲透,而出現了許多邊緣學科和交叉學科。本章簡要介紹數學三大核心領域中十幾門主要分支學科的有關歷史發展狀況。
1、代數學範疇
1、算術
算術有兩種含義,一種是從中國傳下來的,至關於通常所說的「數學」,如《九章算術》等。另外一種是從歐洲數學翻譯過來的,源自希臘語,有「計算技術」之意。如今通常所說的「算術」,每每指天然數的四則運算;若是是在高等數學中,則有「數論」的含義。做爲現代小學課程內容的算術,主要講的是天然數、正分數以及它們的四則運算,並經過由計數和度量而引發的一些最簡單的應用題加以鞏固。
算術是數學中最古老的一個分支,它的一些結論是在長達數千年的時間裏,緩慢而逐漸地創建起來的。它們反映了在許多世紀中積累起來,並不斷凝固在人們意識中的經驗。
天然數:是在對於對象的有限集合進行計算的過程當中,產生的抽象概念。平常生活中要求人們不只要計算單個的對象,還要計算各類量,例如長度、重量和時間。爲了知足這些簡單的量度須要,就要用到分數。
現代初等算術運算方法的發展,起源於印度,時間可能在10世紀或11世紀。它後來被阿拉伯人採用,以後傳到西歐。15世紀,它被改形成如今的形式。在印度算術的後面,明顯地存在着我國古代的影響。
19世紀中葉,格拉斯曼第一次成功地挑選出一個基本公理體系,來定義加法與乘法運算;而算術的其它命題,能夠做爲邏輯的結果,從這一體系中被推導出來。後來,皮亞諾進一步完善了格拉斯曼的體系。
算術的基本概念和邏輯推論法則,以人類的實踐活動爲基礎,深入地反映了世界的客觀規律性。儘管它是高度抽象的,但因爲它歸納的原始材料是如此普遍,所以咱們幾乎離不開它。同時,它又構成了數學其它分支的最堅實的基礎。
2、初等代數
做爲中學數學課程主要內容的初等代數,其中心內容是方程理論。代數一詞的拉丁文原意是「歸位」。代數方程理論在初等代數中是由一元一次方程向兩個方面擴展的:其一是增長未知數的個數,考察由有幾個未知數的若干個方程所構成的二元或三元方程組(主要是一次方程組);其二是增高未知量的次數,考察一元二次方程或準二次方程。初等代數的主要內容在16世紀便已基本上發展完備了。
古巴比倫(公元前19世紀~前17世紀)解決了一次和二次方程問題,歐幾里得的《本來》(公元前4世紀)中就有用幾何形式解二次方程的方法。我國的《九章算術》(公元1世紀)中有三次方程和一次聯立方程組的解法,並運用了負數。3世紀的丟番圖用有理數求一次、二次不定方程的解。13世紀我國出現的天元術(李冶《測圓海鏡》)是有關一元高次方程的數值解法。16世紀意大利數學家發現了三次和四次方程的解法。
代數學符號發展的歷史,可分爲三個階段。第一個階段爲三世紀以前,對問題的解不用縮寫和符號,而是寫成一篇論文,稱爲文字敘述代數。第二個階段爲三世紀至16世紀,對某些較常出現的量和運算採用了縮寫的方法,稱爲簡化代數。三世紀的丟番圖的傑出貢獻之一,就是把希臘代數學簡化,開創了簡化代數。然而此後文字敘述代數,在除了印度之外的世界其它地方,還十分普通地存在了好幾百年,尤爲在西歐一直到15世紀。第三個階段爲16世紀之後,對問題的解多半表現爲由符號組成的數學速記,這些符號與所表現的內容沒有什麼明顯的聯繫,稱爲符號代數。16世紀韋達的名著《分析方法入門》,對符號代數的發展有很多貢獻。16世紀末,維葉特開創符號代數,經笛卡爾改進後成爲現代的形式。
「+」、「-」號第一次在數學書中出現,是1489年魏德曼的著做。不過正式爲你們所公認,做爲加、減法運算的符號,那是從1514年由荷伊克開始的。1540年,雷科德開始使用如今使用「=」。到1591年,韋達在著做中大量使用後,才逐漸爲人們所接受。1600年哈里奧特創用大於號「>」和小於號「<」。1631年,奧屈特給出「×」、「÷」做爲乘除運算符。1637年,笛卡爾第一次使用了根號,並引進用字母表中頭前的字母表示已知數、後面的字母表示未知數的習慣作法。至於「≮」、「≯」、「≠」這三個符號的出現,那是近代的事了。
數的概念的拓廣,在歷史上並不全是由解代數方程所引發的,但習慣上仍把它放在初等代數裏,以求與這門課程的安排相一致。公元前4世紀,古希臘人發現無理數。公元前2世紀(西漢時期),我國開始應用負數。1545年,意大利的卡爾達諾開始使用虛數。1614年,英國的耐普爾發明對數。17世紀末,通常的實數指數概念才逐步造成。
3、高等代數-多項式方程
在高等代數中,一次方程組(即線性方程組)發展成爲線性代數理論;而—、二次方程發展成爲多項式理論。前者是向量空間、線性變換、型論、不變量論和張量代數等內容的一門近世代數分支學科,然後者是研究只含有一個未知量的任意次方程的一門近世代數分支學科。做爲大學課程的高等代數,只研究它們的基礎。
1683年關孝和(日本人)最先引入行列式概念。關於行列式理論最系統的論述,則是雅可比1841年的《論行列式的造成與性質》一書。在邏輯上,矩陣的概念先於行列式的概念;而在歷史上,次序正相反。凱雷在1855年引入了矩陣的概念,在1858年發表了關於這個課題的第一篇重要文章《矩陣論的研究報告》。
19世紀,行列式和矩陣受到人們極大的關注,出現了千餘篇關於這兩個課題的文章。可是,它們在數學上並非大的改革,而是速記的一種表達式。不過已經證實它們是高度有用的工具。
多項式代數的研究始於對3、4次方程求根公式的探索。1515年,菲洛解決了被簡化爲缺2次項的3次方程的求解問題。1540年,費爾拉里成功地發現了通常4次方程的代數解法。人們繼續尋求5次、6次或更高次方程的求根公式,但這些努力在200多年中付諸東流。
1746年,達朗貝爾首先給出了「代數學基本定理」的證實(有不完善之處)。這個定理斷言:每個實係數或復係數的n次代數方程,至少有一個實根或復根。所以,通常地說,n次代數方程應當有n個根。1799年,22歲的高斯在寫博士論文中,給出了這個定理的第一個嚴格的證實。1824年,22歲的阿貝爾證實了:高於4次的通常方程的所有係數組成的根式,不多是它的根。1828年,年僅17歲的伽羅華創立了「伽羅華理論」,包含了方程能用根號解出的充分必要條件。
4、數論
以正整數做爲研究對象的數論,能夠看做是算術的一部分,但它不是以運算的觀點,而是以數的結構的觀點,即一個數可用性質較簡單的其它數來表達的觀點來研究數的。所以能夠說,數論是研究由整數按必定形式構成的數系的科學。
早在公元前3世紀,歐幾里得的《本來》討論了整數的一些性質。他證實素數的個數是無窮的,他還給出了求兩個數的公約數的展轉相除法。這與我國《九章算術》中的「更相減損法」是相同的。埃拉托色尼則給出了尋找不大於給定的天然數N的所有素數的「篩法」:在寫出從1到N的所有整數的紙草上,依次挖去2、3、5、7……的倍數(各自的2倍,3倍,……)以及1,在這篩子般的紙草上留下的便全是素數了。
當兩個整數之差能被正整數m除盡時,便稱這兩個數對於「模」m同餘。我國《孫子算經》(公元4世紀)中計算一次同餘式組的「求一術」,有「中國剩餘定理」之稱。13世紀,秦九韶已創建了比較完整的同餘式理論——「大衍求一術」,這是數論研究的內容之一。
丟番圖的《算術》中給出了求x?+y?=z?全部整數解的方法。費爾馬指出x^n+y^n=z^n在n>3時無整數解,對於該問題的研究產生了19世紀的數論。以後高斯的《數論研究》(1801年)造成了系統的數論。
數論的古典內容基本上不借助於其它數學分支的方法,稱爲初等數論。17世紀中葉之後,曾受數論影響而發展起來的代數、幾何、分析、機率等數學分支,又反過來促進了數論的發展,出現了代數數論(研究整係數多項式的根—「代數數」)、幾何數論(研究直線座標系中座標均爲整數的所有「整點」—「空間格網」)。19世紀後半期出現瞭解析數論,用分析方法研究素數的分佈。二十世紀出現了完備的數論理論。
5、抽象代數-近世代數
1843年,哈密頓發明了一種乘法交換律不成立的代數——四元數代數。第二年,格拉斯曼推演出更有通常性的幾類代數。1857年,凱雷設計出另外一種不可交換的代數——矩陣代數。他們的研究打開了抽象代數(也叫近世代數)的大門。實際上,減弱或刪去普通代數的某些假定,或將某些假定代之以別的假定(與其他假定是相容的),就能研究出許多種代數體系。
1870年,克隆尼克給出了有限阿貝爾羣的抽象定義;狄德金開始使用「體」的說法,並研究了代數體;1893年,韋伯定義了抽象的體;1910年,施坦尼茨展開了體的通常抽象理論;狄德金和克隆尼克創立了環論;1910年,施坦尼茨總結了包括羣、代數、域等在內的代數體系的研究,開創了抽象代數學。
1926年,諾特完成了理想(數)理論;1930年,畢爾霍夫創建格論,它源於1847年的布爾代數;第二次世界大戰後,出現了各類代數系統的理論和布爾巴基學派;1955年,嘉當、格洛辛狄克和愛倫伯克創建了同調代數理論。
到如今爲止,數學家們已經研究過200多種這樣的代數結構,其中最主要德若當代數和李代數是不服從結合律的代數的例子。這些工做的絕大部分屬於20世紀,它們使通常化和抽象化的思想在現代數學中獲得了充分的反映。
抽象代數是研究各類抽象的公理化代數系統的數學學科。典型的代數系統有羣、環、域等,它們主要起源於19世紀的羣論,包含有羣論、環論、伽羅華理論、格論、線性代數等許多分支,並與數學其它分支相結合產生了代數幾何、代數數論、代數拓撲、拓撲羣等新的數學學科。抽象代數已經成了當代大部分數學的通用語言。(其中李羣機器學習方法稱爲機器學習方法的一個重要分支)
如今,能夠籠統地把代數學解釋爲關於字母計算的學說,但字母的含義是在不斷地拓廣的。在初等代數中,字母表示數;而在高等代數和抽象代數中,字母則表示向量(或n元有序數組)、矩陣、張量、旋量、超複數等各類形式的量。能夠說,代數已經發展成爲一門關於形式運算的通常學說了。
2、幾何學範疇
1、初等幾何-測量幾何
在希臘語中,「幾何學」是由「地」與「測量」合併而來的,原本有測量土地的含義,意譯就是「測地術」。「幾何學」這個名詞,系我國明代數學家根據讀音譯出的,沿用至今。
如今的初等幾何主要是指歐幾里得幾何,它是討論圖形(點、線、面、角、圓等)在運動下的不變性質的科學。例如,歐氏幾何中的兩點之間的距離,兩條直線相交的交角大小,半徑是r的某一圓的面積等都是一些運動不變量。
初等幾何做爲一門課程來說,安排在初等代數以後;然而在歷史上,幾何學的發展曾優先於代數學,它主要被認爲是古希臘人的貢獻。
幾何學捨棄了物質全部的其它性質,只保留了空間形式和關係做爲本身研究的對象,所以它是抽象的。這種抽象決定了幾何的思惟方法,就是必須用推理的方法,從一些結論導出另外一些新結論。定理是用演繹的方式來證實的,這種論證幾何學的表明做,即是公元前三世紀歐幾里得的《本來》,它從定義與公理出發,演繹出各類幾何定理。
如今中學《平面三角》中關於三角函數的理論是15世紀才發展完善起來的,可是它的一些最基本的概念,卻早在古代研究直角三角形時便己造成。所以,可把三角學劃在初等幾何這一標題下。
古代埃及、巴比倫、中國、希臘都研究過有關球面三角的知識。公元前2世紀,希帕恰斯製做了弦表,能夠說是三角的創始人。後來印度人制做了正弦表;阿拉伯的阿爾·巴塔尼用計算sinθ值的方法來解方程,他還與阿布爾·沃法共同導出了正切、餘切、正割、餘割的概念;賴蒂庫斯做了較精確的正弦表,並把三角函數與圓弧聯繫起來。
因爲直角三角形是最簡單的直線形,又具備很重要的實用價值,因此各文明古國都極重視它的研究。我國《周髀算經》一開始就記載了周朝初年(約公元前1100年左右)的周公與學者商高的對話,其中就談到「勾三股四弦五」,即勾股定理的特殊形式;還記載了在周公以後的陳子,曾用勾股定理和類似圖形的比例關係,推算過地球與太陽的距離和太陽的直徑,同時爲勾股定理做的圖注達幾十種之多。在國外,傳統稱勾股定理爲畢達哥拉斯定理,認爲它的第一個一致性的證實源於畢氏學派(公元前6世紀),雖然巴比倫人在此之前1000多年就發現了這個定理。到如今人們對勾股定理已經至少提供了370種證實。
19世紀以來,人們對於關於三角形和圓的初等綜合幾何,又進行了深刻的研究。至今這一研究領域仍然沒有到頭,很多資料已引伸到四面體及伴隨的點、線、面、球。
2、射影幾何-變換幾何
射影幾何學是一門討論在把點射影到直線或平面上的時候,圖形的不變性質的一門幾何學。幻燈片上的點、線,通過幻燈機的照射投影,在銀幕上的圖畫中都有相對應的點線,這樣一組圖形通過有限次透視之後,變成另外一組圖形,這在數學上就叫作射影對應。射影幾何學在航空、攝影和測量等方面都有普遍的應用。
射影幾何是迪沙格和帕斯卡在1639年開闢的。迪沙格發表了—本關於圓維曲線的頗有首創性的小冊子,從開普勒的連續性原理開始,導出了許多關於對合、調和變程、透射、極軸、極點以及透視的基本原理,這些課題是今天學習射影幾何這門課程的人所熟悉的。年僅16歲的帕斯卡得出了一些新的、深奧的定理,並於9年後寫了一分內容很豐富的手稿。18世紀後期,蒙日提出了二維平面上的適當投影表達三維對象的方法,於是從提供的數據能快速算出炮兵陣地的位置,避開了冗長的、麻煩的算術運算。
射影幾何真正獨立的研究是由彭賽勒開創的。1822年,他發表了《論圖形的射影性質》一文,給該領域的研究以巨大的推進做用。他的許多概念被斯坦納進一步發展。1847年,斯陶特發表了《位置幾何學》一書,使射影幾何最終從測量基礎中解脫出來。
後來證實,採用度量適當的射影定義,能在射影幾何的範圍內研究度量幾何學。將一個不變二次曲線添加到平面上的射影幾何中,就能獲得傳統的非歐幾何學。在19世紀晚期和20世紀初期,對射影幾何學做了多種公設處理,而且有限射影幾何也被發現。事實證實,逐漸地增添和改變公設,就能從射影幾何過渡到歐幾里得幾何,其間經歷了許多其它重要的幾何學。
3、解析幾何-代數幾何化
解析幾何即座標幾何,包括平面解析幾何和立體解析幾何兩部分。解析幾何經過平面直角座標系和空間直角座標系,創建點與實數對之間的一一對應關係,從而創建起曲線或曲面與方程之間的一一對應關係,於是就能用代數方法研究幾何問題,或用幾何方法研究代數問題。
在初等數學中,幾何與代數是彼此獨立的兩個分支;在方法上,它們也基本是互不相關的。解析幾何的創建,不只因爲在內容上引入了變量的研究而開創了變量數學,並且在方法上也使幾何方法與代數方法結合起來。
在迪沙格和帕斯卡開闢了射影幾何的同時,笛卡兒和費爾馬開始構思現代解析幾何的概念。這兩項研究之間存在一個根本區別:前者是幾何學的一個分支,後者是幾何學的一種方法。
1637年,笛卡兒發表了《方法論》及其三個附錄,他對解析幾何的貢獻,就在第三個附錄《幾何學》中,他提出了幾種由機械運動生成的新曲線。在《平面和立體軌跡導論》中,費爾馬解析地定義了許多新的曲線。在很大程度上,笛卡兒從軌跡開始,而後求它的方程;費爾馬則從方程出發,而後來研究軌跡。這正是解析幾何基本原則的兩個相反的方面,「解析幾何」的名稱是之後才定下來的。
這門課程達到如今課本中熟悉的形式,是100多年之後的事。象今天這樣使用座標、橫座標、縱座標這幾個術語,是萊布尼茲於1692年提出的。1733年,年僅18歲的克雷洛出版了《關於雙重曲率曲線的研究》一書,這是最先的一部空間解析幾何著做。1748年,歐拉寫的《無窮分析概要》,能夠說是符合現代意義的第一部解析幾何學教程。1788年,拉格朗日開始研究有向線段的理論。1844年,格拉斯曼提出了多維空間的概念,並引入向量的記號。因而多維解析幾何出現了。
解析幾何在近代的發展,產生了無窮維解析幾何和代數幾何等一些分支。普通解析幾何只不過是代數幾何的一部分,而代數幾何的發展同抽象代數有着密切的聯繫。
4、非歐幾何-廣義空間幾何
非歐幾何有三種不一樣的含義:狹義的,單指羅氏(羅巴切夫斯基)幾何;廣義的,泛指一切和歐氏(歐幾里得)幾何不一樣的幾何;一般意義的,指羅氏幾何和黎曼幾何。
歐幾里得的第5公設(平行公設)在數學史上佔有特殊的地位,它與前4條公設相比,性質顯得太複雜了。它在《本來》中第一次應用是在證實第29個定理時,並且此後彷佛老是儘可能避免使用它。所以人們懷疑第五公設的公理地位,並探索用其它公理來證實它,以使它變爲一條定理。在三千多年的時間中,進行這種探索並有案可查的就達兩千人以上,其中包括許多知名的數學家,但他們都失敗了。
羅巴契夫斯基於1826年,鮑耶於1832年發表了劃時代的研究結果,開創了非歐幾何。在這種幾何中,他們假設「過不在已知直線上的一點,能夠引至少兩條直線平行於已知直線」,用以代替第五公設,同時保留了歐氏幾何的其它公設。
1854年,黎曼推出了另外一種非歐幾何。在這種幾何中,他假設「過已知直線外一點,沒有和已知直線平行的直線可引」,用以代替第5公設,同時保留了歐氏幾何的其它公設。1871年,克萊因把這3種幾何:羅巴契夫斯基—鮑耶的、歐幾里得的和黎曼的分別定名爲雙曲幾何、拋物幾何和橢圓幾何。
非歐幾何的發現不只最終解決了平行公設的問題——平行公設被證實是獨立於歐氏幾何的其它公設的,並且把幾何學從其傳統模型中解放出來,創造了許多不一樣體系的幾何的道路被打開了。
1854年,黎曼發表了「關於做爲幾何學基礎的假設的講演」。他指出:每種不一樣的(兩個無限靠近的點的)距離公式決定了最終產生的空間和幾何的性質。1872年,克萊因創建了各類幾何系統按照不一樣變換羣不變量的分類方法。
19世紀之後,幾何空間概念發展的另外一方向,是按照所研究流形的微分幾何原則的分類,每一種幾何都對應着一種定理系統。1899年,希爾伯特發表了《幾何基礎》一書,提出了完備的幾何公理體系,創建了歐氏幾何的嚴密的基礎,並給出了證實一個公理體系的相容性(無矛盾性)、獨立性和完備性的廣泛原則。按照他的觀點,不一樣的幾何空間乃是從屬於不一樣幾何公理要求的元素集合。歐氏幾何和非歐幾何,在大量的幾何系統中,只不過是極其特殊的情形罷了。
5、拓撲學-代數拓撲和幾何拓撲
1736年,歐拉發表論文,討論哥尼斯堡七橋問題。他還提出球面三角形剖分圖形頂點、邊、面之間關係的歐拉公式,這能夠說是拓撲學的開端。
龐加萊於1895~1904年創建了拓撲學,採用代數組合的方法研究拓撲性質。他把歐拉公式推廣爲歐拉—龐加萊公式,與此有關的理論如今稱爲同調理論和同倫理論。之後的拓撲學主要按照龐加萊的設想發展。
拓撲學開始是幾何學的一個分支,在二十世紀它獲得了極大的推廣。1906年,弗雷歇發表博士論文,把函數做爲一個「點」來看,把函數收斂描繪成點的收斂,這就把康託的點集論和分析學的抽象化聯繫起來了。他在函數所構成的集合中引入距離的概念,構成距離空間,展開了線性距離空間的理論。在這個基礎上,產生了點集拓撲學。在豪斯道夫的《點集論綱要》一書中,出現了更通常的點集拓撲學的完整想法。第二次世界大戰後,把分析引進拓撲,發展了微分拓撲。
如今的拓撲學能夠粗略地定義爲對於連續性的數學研究。任何事物的集合都能在某種意義上構成拓撲空間,拓撲學的概念和理論已基本完組成爲數學的基礎理論之一,滲入到各個分支,而且成功地應用於電磁學和物理學的研究。
3、分析學範疇
1、微積分
微積分學是微分學和積分學的統稱,它是研究函數的導數、積分的性質和應用的一門數學分支學科。
微積分的出現具備劃時代意義,時至今日,它不只成了學習高等數學各個分支必不可少的基礎,並且是學習近代任何一門天然科學和工程技術的必備工具。如今的微積分學的教程,一般的講授次序是先極限、再微分、後積分,這與歷史順序正好相反。
在微積分歷史中,最初的問題是涉及計算面積、體積和弧長的。阿基米得(公元前3世紀)的方法最接近於現行的積分法。在17世紀探索微積分的至少有十幾位大數學家和幾十位小數學家。牛頓和萊布尼茨分別進行了創造性的工做,各自獨立地跑完了「微積分這場接力賽的最後一棒」。
1609年,開普勒爲了計算行星運動第二定律中包含的面積,和在他的論文中討論的酒桶的體積,而藉助了某種積分方法。1635年,卡瓦列利發表了一篇闡述不可分元法的論文,提出卡瓦列利原理,它是計算面積和體積的有價值的工具。1650年,沃利斯把卡瓦列利的方法系統化,並做了推廣。
微分起源於做曲線的切線和求函數的極大值或極小值問題。雖然能夠追溯到古希臘,可是第一個真正值得注意的先驅工做,是費爾馬1629年陳述的概念。1669年,巴羅對微分理論做出了重要的貢獻,他用了微分三角形,很接近現代微分法。通常認爲,他是充分地認識到微分法爲積分法的逆運算的第一我的。
至此,還有什麼要作的呢?首要的是,創造通常的符號和一整套形式的解析規則,造成能夠應用的微積分學,這項工做是由牛頓和萊布尼茲彼此獨立地作出的。接着的工做是在可接受的嚴格的基礎上,從新推導基本理論,這必須等到此課題想到多方面應用以後。柯西和他的後繼者們完成了這一工做。
牛頓早在1665年才23歲時,就創造了流數法(微分學),並發展到能求曲線上任意一點的切線和曲率半徑。他的《流數法》寫於1671年,但直到死後9年的1736年才發表。牛頓考慮了兩種類型的問題,等價於如今的微分和解微分方程。他定義了流數(導數)、極大值、極小值、曲線的切線、曲率、拐點、凸性和凹性,並把它的理論應用於許多求積問題和曲線的求長問題。
牛頓創立的微積分原理是同他的力學研究分不開的,他藉此發現、並研究了力學三大定律和萬有引力定律,1687年出版了名著《天然哲學的數學原理》。這本書是研究天體力學的,包括了微積分的一些基本概念和原理。
萊布尼茨是在1673年到1676年之間,從幾何學觀點上獨立發現微積分的。1676年,他第一次用長寫字母∫表示積分符號,象今天這樣寫微分和微商。1684年~1686年,他發表了一系列微積分著做,力圖找到廣泛的方法來解決問題。今天課本中的許多微分的基本原則就是他推導出來的,如求兩個函數乘積的n階導數的法則,如今仍稱做菜布尼茲法則。萊布尼茲的另外一最大功績是創造了反映事物本質的數字符號,數學分析中的基本概念的記號,例如微分dx,二級微分dx?,積分∫ydx,導數dy/dx等都是他提出來的,而且沿用至今,很是方便。
牛頓與萊布尼茨的創造性工做有很大的不一樣。主要差異是牛頓把x和y的無窮小增量做爲求導數的手段,當增量愈來愈小的時候,導數實際上就是增量比的極限,而萊布尼茲卻直接用x和y的無窮小增量(就是微分)求出它們之間的關係。
這個差異反映了他們研究方向的不一樣,在牛頓的物理學方向中,速度之類是中心概念;而在萊布尼茲的幾何學方向中,卻着眼於面積體積的計算。其它差異是,牛頓自由地用級數表示函數,採用經驗的、具體和謹慎的工做方式,認爲用什麼記號可有可無;而萊布尼茲則寧願用有限的形式來表示函數,採用富於想象的、喜歡推廣的、大膽的工做方式,花費不少時間來選擇富有提示性的符號。
到1700年,如今大學且學習的大部分微積份內容已經創建起來。第一部微積分課本出版於1696年,是洛比達寫的。1769年,歐拉論述了二重積分。1773年,拉格朗日考察了三重積分。1837年,波爾查諾給出了級數的現代定義。19世紀分析學的嚴謹化,是由柯西奠定的。如今課本中的極限、連續性定義、把導數看做差商的極限、把定積分看作和的權限等等,實質上都是柯西給出的。進一步完成這一工做的是威爾斯特拉斯,他給出瞭如今使用的精確的極限定義,並同狄德金、康託於19世紀70年代創建了嚴格的實數理論,使微積分有了堅固可靠的邏輯基礎。
2、微分方程
凡是表示未知函數和未知函數的導數以及自變量之間的關係的方程,就叫作微分方程。若是未知函數是一元函數,則稱爲常微分方程,若是未知函數是多元函數,則稱爲偏微分方積。微分方程的基本問題是在必定條件下,從所給出的微分方程解出未知函數。
微分方程幾乎是與微積分同時發展起來的,因爲它與力學、物理學的淵源很深,因此在13世紀便已自成一門獨立的學科了。兩個多世紀來,這一學科已發展得至關完善。
1676年,萊布尼茲在致牛頓的信中,首先提出了「微分方程」這個名稱。在他們兩人的著做中,都包含了許多微分方程的實例。早期的研究側重於探討各種一階方程的解法,並由此致使了方程的分類。18世紀,歐拉解決了全微分方程和「歐拉方程」(一類高階變係數線性微分方程),提出了通解和特解的概念,指出了n階線性方程通解的結構。其後,泰勒獲得了方程的奇解;拉格朗日推導了非齊次線性方程的常數交易法。
對於微分方程組的研究,始於達朗貝爾。19世紀前半葉,柯西開始研究解的存在性和惟一性。19世紀後半葉,數學家們開始利用羣論來研究微分方程,由此創建連續羣和李羣的新理論。龐加萊引入了極限環的概念,李雅普諾夫引入了微分方程組解的穩定性概念。他們的方法都沒必要直接求解,稱爲定性理論。1927年,畢爾霍夫創建了「動力系統」的一段定性理論。
一階偏微分方程的研究首先是從幾何學問題開始的。拉格朗日指出,解一階線性偏微分方程的技巧,在於把它們化爲常微分方程。一階非線性偏微分方程的研究,始於歐拉和拉格朗日,蒙日爲偏微分方程的幾何理論奠基了基礎。到18世紀末葉,在引入奇解、通解、全積分、通積分、特積分等概念以後,偏微分方程已造成一門獨立的學科。
二階偏微分方程的研究,始於18世紀的弦振動理論。一般見的二階偏微分方程均來自物理或力學的實際問題,它們構成了這門學科中一個獨立的系統—數學物理方程。
積分方程源於阿貝爾1826年的工做,可是直到1888年杜·波阿·雷蒙的著做中,才正式提出了積分方程這個名詞。1896年開始,伏特拉給出了兩類積分方程的通常理論;不久,弗雷德荷姆大致上完成了一類重要的線性積分方程理論。因爲這類積分方程常出如今一些物理問題中,所以積分方程論常被包含在數學物理方程內。
現代科學技術,如空間技術、現代物理學、力學等,都有許多問題須要用微分方程來求解,甚至在化學、生物學、醫藥學、經濟學等方面,微分方程的應用也愈來愈多。
3、微分幾何
微分幾何這門分支學科主要研究三維歐氏空間中曲線和曲面的內在性質,所謂內在性質就是同幾何對象在空間中的位置無關的性質。它以微積分、微分方程這些分支學科的理論爲研究工具。或簡單地說,微分幾何就是用分析方法研究幾何性質。
微分幾何的發端可見於1731年克萊洛的著做中。蒙日1809年的著做包含了這一學科的雛型;歐拉研究了曲面的通常理論;高斯1827年的《關於曲面的通常研究》一書,論述了曲面理論,創立了內蘊幾何學,奠基了曲面微分幾何的基礎。1887~1896年,達布的《曲面通常理論的講義》集曲線和曲面微分幾何之大成。
變換理論對於微分幾何的影響,產生了射影微分幾何、仿射微分幾何等分支。二十世紀初,出現了對非充分光滑曲線和曲面以及曲線曲面的總體問題的研究,造成現代微分幾何。1923年,嘉當提出了通常聯絡的理論。1945年,陳省身創建了代數拓撲和微分幾何的聯繫,他又是纖維叢概念的建立人之一。
4、函數論
函數論包括複變函數論和實變函數論,但有時也單指複變函數論(或複分析)而言。
複數概念出現於16世紀,但對它的全面掌握和普遍運用,卻遲至18世紀。自變量是複數的函數,叫作複變函數。若是複變函數在某一區域內除了可能有有限個例外點以外,到處有導數,那麼這個伏辯函數叫作在這個區域內的解析函數;例外點叫作奇點。複變函數論主要研究解析函數的性質。
複變函數的研究是從18世紀開始的。30~40年代,歐拉利用冪級數詳細討論了初等複變函數的性質。達朗貝爾於1752年得出複變函數可微的必要條件(即「柯西—黎曼條件」)。拉普拉斯也考慮過複變函數的積分。
複變函數的全面發展是在19世紀。1825年,柯西討論了虛限定積分,1831年他實質上推出了柯西積分公式,並在此基礎上創建了一整套複變函數微分和積分的理論。黎曼1851年的博士論文《複變函數論的基礎》,奠基了複變函數論的基礎。他推廣了單位解析函數到多位解析函數;引入了「黎曼曲面」的重要概念,確立了復變因數的幾何理論基礎;證實了保角映射基本定理。威爾斯特拉斯徹底擺脫了幾何直觀,以冪級數爲工具,用嚴密的純解析推理展開了函數論。定義解析函數是能夠展開爲冪級數的函數,圍繞着奇點研究函數的性質。近幾十年來,複變函數論又有很大的推動。
複變函數論是解決工程技術問題的有力工具,飛機飛行理論、熱運動理論、流體力學理論、電場和彈性理論等中的不少問題。
實變函數的發展較晚,其中積分論是它的重要組成部分。容度和測度是線段長度概念的推廣,是爲了推廣積分的概念而創建起來的。1893年,約當給出了「約當容度」的概念,並用於討論積分。1894年,斯提捷首先推廣了積分概念,獲得了「斯提捷積分」。1898年,波萊爾改進了容度的概念,他稱之爲‘測度」。下一步決定性的進展是1902年勒貝格改進了測度理論,創建了「勒貝格測度」、「勒貝格積分」等概念。1904年,他徹底解決了黎曼可積性的問題。後來,數學家們對積分的概念又做了種種推廣和探索。
實變函數的另外一個領域是函數構造論。1885年,威爾斯特拉斯證實:連續函數必可表示爲一致收斂的多項式級數。這一結果和切比雪夫斯基最佳逼近論,是函數構造論的開端。近年來,這個方向的研究十分活躍。
5、泛函分析
本世紀初,出現了一個廣闊的新領域——泛函分析,它是古典分析觀點的推廣。近幾十年來,因爲分析學中許多新分支的造成,從而發如今代數、幾何、分析中不一樣領域之間的某些方面的相似。其次,幾何與集合論的結合產生了抽象空間的理論,將函數當作函數空間中的點。再加上實變函數論以及近世代數的感念和方法的影響,就產生了泛畫分析。它綜合函數論,幾何和代數的觀點,研究無窮維向量空間上的函數、算子和極限理論。
19世紀末,弗爾太拉和二十世紀初阿達瑪的著做中已出現泛函分析的萌芽。隨後希爾伯特、海令哲開創了「希爾伯將空間」的研究,黎斯、馮·諾伊曼等人在這方面都有重要的建樹。
未完待續..............................
三:OpenGL圖像學基礎
1、OpenGL與3D圖形世界
OpenGL是基於圖元建模的典範,粒子建模計算太複雜以致於如今還僅僅是停留在學術領域,做爲將來的方向繼續發展.
1.一、OpenGL令人們進入三維圖形世界
咱們生活在一個充滿三維物體的三維世界中,爲了使計算機能精確地再現這些物體,咱們必須能在三維空間描繪這些物體。咱們又生活在一個充滿信息的世界中,可否儘快地理解並運用這些信息將直接影響事業的成敗,因此咱們須要用一種最直接的形式來表示這些信息。
最近幾年計算機圖形學的發展使得三維表現技術得以造成,這些三維表現技術使咱們可以再現三維世界中的物體,可以用三維形體來表示複雜的信息,這種技術就是可視化(Visualization)技術。可視化技術令人可以在三維圖形世界中直接對具備形體的信息進行操做,和計算機直接交流。這種技術已經把人和機器的力量以一種直覺而天然的方式加以統一,這種革命性的變化無疑將極大地提升人們的工做效率。可視化技術賦予人們一種仿真的、三維的而且具備實時交互的能力,這樣人們能夠在三維圖形世界中用之前不可想象的手段來獲取信息或發揮本身創造性的思惟。機械工程師能夠從二維平面圖中得以解放直接進入三維世界,從而很快獲得本身設計的三維機械零件模型。醫生能夠從病人的三維掃描圖象分析病人的病竈。軍事指揮員能夠面對用三維圖形技術生成的戰場地形,指揮具備真實感的三維飛機、軍艦、坦克向目標開進並分析戰鬥方案的效果。
更使人驚奇的是目前正在發展的虛擬現實技術,它能令人們進入一個三維的、多媒體的虛擬世界,人們能夠遊歷遠古時代的城堡,也能夠遨遊浩翰的太空。全部這些都依賴於計算機圖形學、計算機可視化技術的發展。人們對計算機可視化技術的研究已經歷了一個很長的歷程,並且造成了許多可視化工具,其中SGI公司推出的GL三維圖形庫表現突出,易於使用並且功能強大。利用GL開發出來的三維應用軟件頗受許多專業技術人員的喜好,這些三維應用軟件已涉及建築、產品設計、醫學、地球科學、流體力學等領域。隨着計算機技術的繼續發展,GL已經進一步發展成爲OpenGL,OpenGL已被認爲是高性能圖形和交互式視景處理的標準,目前包括ATT公司UNIX軟件實驗室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和 SGI公司在內的幾家在計算機市場佔領導地位的大公司都採用了OpenGL圖形標準。
值得一提的是,因爲Microsoft公司在 Windows NT中提供OpenGL圖形標準,OpenGL將在微機中普遍應用,尤爲是OpenGL三維圖形加速卡和微機圖形工做站的推出,人們能夠在微機上實現三維圖形應用,如CAD設計、仿真模擬、三維遊戲等,從而更有機會、更方便地使用OpenGL及其應用軟件來創建本身的三維圖形世界。
1.二、OpenGL提供直觀的三維圖形開發環境
OpenGL其實是一種圖形與硬件的接口。它包括了120個圖形函數,開發者能夠用這些函數來創建三維模型和進行三維實時交互。與其餘圖形程序設計接口不一樣,OpenGL提供了十分清晰明瞭的圖形函數,所以初學的程序設計員也能利用OpenGL的圖形處理能力和1670萬種色彩的調色板很快地設計出三維圖形以及三維交互軟件。
OpenGL強有力的圖形函數不要求開發者把三維物體模型的數據寫成固定的數據格式,這樣開發者不但能夠直接使用本身的數據,並且能夠利用其餘不一樣格式的數據源。這種靈活性極大地節省了開發者的時間,提升了軟件開發效益。
長期以來,從事三維圖形開發的技術人員都不得不在本身的程序中編寫矩陣變換、外部設備訪問等函數,這樣爲調製這些與本身的軟件開發目標關係並不十分密切的函數費腦筋,而OpenGL正是提供一種直觀的編程環境,它提供的一系列函數大大地簡化了三維圖形程序。例如:
相應函數 | 具體說明 |
OpenGL實用庫 | 43個函數,每一個函數以glu開頭。 |
OpenGL輔助庫 | 31個函數,每一個函數以aux開頭。 |
Windows專用庫函數(WGL) | 6個函數,每一個函數以wgl開頭。 |
Win32 API函數 | 5個函數,函數前面沒有專用前綴。 |
#include <GL/gl.h>
#include <GL/glaux.h>
#include "glos.h"
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
glFlush();
_sleep(1000);
}
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)設置窗口顯示模式爲RGBA方式,即彩色方式,而且圖形緩存爲單緩存(SINGLE BUFFER)。 auxInitPosition(0, 0, 500, 500)定義窗口的初始位置,前兩個參數(0, 0)爲窗口的左上角點的屏幕座標,後兩個參數(500,500)爲窗口的寬度和高度。auxInitWindow("simple")是窗口初始化,字符參數是窗口名稱。 glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
第一句將窗口清爲黑色,第二句將顏色緩衝區清爲glClearColor(0.0, 0.0, 0.0, 0.0)命令所設置的顏色,即同學口背景顏色一致。 glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
很明顯,第一句設置物體顏色,函數中前三個參數分別爲R、G、B值,最後一個參數是Alpha值,範圍都從0至1;第二句繪製一個二維矩形。注意:OpenGL是針對三維圖形而言,所以用做OpenGL編程繪製物體必須意識到任何一個物體都是三維的,具備空間性,而顯示於屏幕上的物體都是三維物體在二維平面上的投影。void function(AUX_EVENTREC *event) { GLint x,y; x=event->data[AUX_MOUSEX]; y=event->data[AUX_MOUSEY]; ... }6.1.3 顏色表裝入
功能 | 函數 |
繪製球 | void auxWireSphere(GLdouble radius) void auxSolidSphere(GLdouble radius) |
繪製立方體 | void auxWireCube(GLdouble size) void auxSolidCube(GLdouble size) |
繪製長方體 | void auxWireBox(GLdouble width,GLdouble height,GLdouble depth) void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) |
繪製環形圓紋面 | void auxWireTorus(GLdouble innerRadius,GLdouble outerRadius) void auxSolidTorus(GLdouble innerRadius,GLdouble outerRadius) |
繪製圓柱 | void auxWireCylinder(GLdouble radius,GLdouble height) void auxSolidCylinder(GLdouble radius,GLdouble height) |
繪製二十面體 | void auxWireIcosahedron(GLdouble radius) void auxSolidIcosahedron(GLdouble radius) |
繪製八面體 | void auxWireOctahedron(GLdouble radius) void auxSolidOctahedron(GLdouble radius) |
繪製四面體 | void auxWireTetrahedron(GLdouble radius) void auxSolidTetrahedron(GLdouble radius) |
繪製十二面體 | void auxWireDodecahedron(GLdouble radius) void auxSolidDodecahedron(GLdouble radius) |
繪製圓錐 | void auxWireCone(GLdouble radius,GLdouble height) void auxSolidCone(GLdouble radius,GLdouble height) |
繪製茶壺 | void auxWireTeapot(GLdouble size) void aucSolidTeapot(GLdouble size) |
表6-1 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK display(void)
{
glColor3f(1.0,1.0,0.0);
auxWireSphere(1.0);
glFlush();
}
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("AUX_SAMPLE");
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
圖6-1 網狀球體 |
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-1.5,1.5,-10.0,10.0);
圖7-1 線段的兩種連結方式 |
圖7-2 合法和非法多邊形 |
glVertex2s(2,3);
glVertex3d(0.0,1.0,3.1414926535);
glVertex4f(2.4,1.0,-2.2,2.0);
GLfloat pp[3]={5.0,2.0,10.2};
glVertex3fv(pp);
glBegin(GL_POLYGON);
glVertex2f(0.0,0.0);
glVertex2f(0.0,3.0);
glVertex2f(3.0,3.0);
glVertex2f(4.0,1.5);
glVertex2f(3.0,0.0);
glEnd();
圖7-3 繪製多邊形或一組頂點 |
類型 | 說明 |
GL_POINTS | 單個頂點集 |
GL_LINES | 多組雙頂點線段 |
GL_POLYGON | 單個簡單填充凸多邊形 |
GL_TRAINGLES | 多組獨立填充三角形 |
GL_QUADS | 多組獨立填充四邊形 |
GL_LINE_STRIP | 不閉合折線 |
GL_LINE_LOOP | 閉合折線 |
GL_TRAINGLE_STRIP | 線型連續填充三角形串 |
GL_TRAINGLE_FAN | 扇形連續填充三角形串 |
GL_QUAD_STRIP | 連續填充四邊形串 |
表7-1 幾何圖元類型和說明 |
圖7-4 幾何圖元類型 |
函數 | 函數意義 |
glVertex*() | 設置頂點座標 |
glColor*() | 設置當前顏色 |
glIndex*() | 設置當前顏色表 |
glNormal*() | 設置法向座標 |
glEvalCoord*() | 產生座標 |
glCallList(),glCallLists() | 執行顯示列表 |
glTexCoord*() | 設置紋理座標 |
glEdgeFlag*() | 控制邊界繪製 |
glMaterial*() | 設置材質 |
表7-2 在glBegin()和glEnd()之間可調用的函數 |
glBegin(GL_POINTS);
glColor3f(1.0,0.0,0.0); /* red color */
glVertex(...);
glColor3f(0.0,1.0,0.0); /* green color */
glColor3f(0.0,0.0,1.0); /* blue color */
glVertex(...);
glVertex(...);
glEnd();
#include "glos.h"
#include<GL/gl.h>
#include<GL/glaux.h>
void myinit(void);
void DrawMyObjects(void);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_FLAT);
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);
else
glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK display(void)
{
glColor3f(1.0,1.0,0.0);
DrawMyObjects();
glFlush();
}
void DrawMyObjects(void)
{
/* draw some points */
glBegin(GL_POINTS);
glColor3f(1.0,0.0,0.0);
glVertex2f(-10.0,11.0);
glColor3f(1.0,1.0,0.0);
glVertex2f(-9.0,10.0);
glColor3f(0.0,1.0,1.0);
glVertex2f(-8.0,12.0);
glEnd();
/* draw some line_segments */
glBegin(GL_LINES);
glColor3f(1.0,1.0,0.0);
glVertex2f(-11.0,8.0);
glVertex2f(-7.0,7.0);
glColor3f(1.0,0.0,1.0);
glVertex2f(-11.0,9.0);
glVertex2f(-8.0,6.0);
glEnd();
/* draw one opened_line */
glBegin(GL_LINE_STRIP);
glColor3f(0.0,1.0,0.0);
glVertex2f(-3.0,9.0);
glVertex2f(2.0,6.0);
glVertex2f(3.0,8.0);
glVertex2f(-2.5,6.5);
glEnd();
/* draw one closed_line */
glBegin(GL_LINE_LOOP);
glColor3f(0.0,1.0,1.0);
glVertex2f(7.0,7.0);
glVertex2f(8.0,8.0);
glVertex2f(9.0,6.5);
glVertex2f(10.3,7.5);
glVertex2f(11.5,6.0);
glVertex2f(7.5,6.0);
glEnd();
/* draw one filled_polygon */
glBegin(GL_POLYGON);
glColor3f(0.5,0.3,0.7);
glVertex2f(-7.0,2.0);
glVertex2f(-8.0,3.0);
glVertex2f(-10.3,0.5);
glVertex2f(-7.5,-2.0);
glVertex2f(-6.0,-1.0);
glEnd();
/* draw some filled_quandrangles */
glBegin(GL_QUADS);
glColor3f(0.7,0.5,0.2);
glVertex2f(0.0,2.0);
glVertex2f(-1.0,3.0);
glVertex2f(-3.3,0.5);
glVertex2f(-0.5,-1.0);
glColor3f(0.5,0.7,0.2);
glVertex2f(3.0,2.0);
glVertex2f(2.0,3.0);
glVertex2f(0.0,0.5);
glVertex2f(2.5,-1.0);
glEnd();
/* draw some filled_strip_quandrangles */
glBegin(GL_QUAD_STRIP);
glVertex2f(6.0,-2.0);
glVertex2f(5.5,1.0);
glVertex2f(8.0,-1.0);
glColor3f(0.8,0.0,0.0);
glVertex2f(9.0,2.0);
glVertex2f(11.0,-2.0);
glColor3f(0.0,0.0,0.8);
glVertex2f(11.0,2.0);
glVertex2f(13.0,-1.0);
glColor3f(0.0,0.8,0.0);
glVertex2f(14.0,1.0);
glEnd();
/* draw some filled_triangles */
glBegin(GL_TRIANGLES);
glColor3f(0.2,0.5,0.7);
glVertex2f(-10.0,-5.0);
glVertex2f(-12.3,-7.5);
glVertex2f(-8.5,-6.0);
glColor3f(0.2,0.7,0.5);
glVertex2f(-8.0,-7.0);
glVertex2f(-7.0,-4.5);
glVertex2f(-5.5,-9.0);
glEnd();
/* draw some filled_strip_triangles */
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(-1.0,-8.0);
glVertex2f(-2.5,-5.0);
glColor3f(0.8,0.8,0.0);
glVertex2f(1.0,-7.0);
glColor3f(0.0,0.8,0.8);
glVertex2f(2.0,-4.0);
glColor3f(0.8,0.0,0.8);
glVertex2f(4.0,-6.0);
glEnd();
/* draw some filled_fan_triangles */
glBegin(GL_TRIANGLE_FAN);
glVertex2f(8.0,-6.0);
glVertex2f(10.0,-3.0);
glColor3f(0.8,0.2,0.5);
glVertex2f(12.5,-4.5);
glColor3f(0.2,0.5,0.8);
glVertex2f(13.0,-7.5);
glColor3f(0.8,0.5,0.2);
glVertex2f(10.5,-9.0);
glEnd();
}
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("Geometric Primitive Types");
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
圖8-1 相機模擬 |
圖8-2 三維圖形的顯示流程 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void CALLBACK display (void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glLoadIdentity (); /* clear the matrix */
glTranslatef (0.0, 0.0, -5.0); /* viewing transformation */
glScalef (1.0, 2.0, 1.0); /* modeling transformation */
auxWireCube(1.0); /* draw the cube */
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glMatrixMode (GL_PROJECTION); /* prepare for and then */
glLoadIdentity (); /* define the projection */
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); /* transformation */
glMatrixMode (GL_MODELVIEW); /* back to modelview matrix */
glViewport (0, 0, w, h); /* define the viewport */
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Perspective 3-D Cube");
myinit ();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
|
||
圖8-3 三維的正面透視立方體 |
圖8-4 視點座標系與世界座標系 |
M = | | m0 m4 m8 m12 | | m1 m5 m9 m13 | | m2 m6 m10 m14 | | m3 m7 m11 M15 | |
圖8-5 平移示意圖 |
圖8-6 旋轉示意圖 |
圖8-7 縮放和反射示意圖 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void draw_triangle(void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void draw_triangle(void)
{
glBegin(GL_LINE_LOOP);
glVertex2f(0.0, 25.0);
glVertex2f(25.0, -25.0);
glVertex2f(-25.0, -25.0);
glEnd();
}
void CALLBACK display(void)
{
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear (GL_COLOR_BUFFER_BIT);
/* draw an original triangle */
glLoadIdentity ();
glColor3f (1.0, 1.0, 1.0); /* white */
draw_triangle ();
/* translating a triangle along X_axis */
glLoadIdentity ();
glTranslatef (-20.0, 0.0, 0.0);
glColor3f(1.0,0.0,0.0); /* red */
draw_triangle ();
/* scaling a triangle along X_axis by 1.5 and along Y_axis by 0.5 */
glLoadIdentity();
glScalef (1.5, 0.5, 1.0);
glColor3f(0.0,1.0,0.0); /* green */
draw_triangle ();
/* rotating a triangle in a counterclockwise direction about Z_axis */
glLoadIdentity ();
glRotatef (90.0, 0.0, 0.0, 1.0);
glColor3f(0.0,0.0,1.0); /* blue */
draw_triangle ();
/* scaling a triangle along Y_axis and reflecting it about Y_axis */
glLoadIdentity();
glScalef (1.0, -0.5, 1.0);
glColor3f(1.0,1.0,0.0); /* yellow */
draw_triangle ();
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w,-1.0,1.0);
else
glOrtho(-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Geometric Transformations");
myinit ();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖8-8 三角形的幾何變換 |
圖8-9 正射投影視景體 |
圖8-10 函數glFrustum()透視投影視景體 |
圖8-11 函數gluPerspective()透視投影視景體 |
圖8-12 附加裁剪平面和視景體 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void CALLBACK display(void)
{
GLdouble eqn[4] = {1.0, 0.0, 0.0, 0.0};
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 0.0, 1.0);
glPushMatrix();
glTranslatef (0.0, 0.0, -5.0);
/* clip the left part of wire_sphere : x<0 */
glClipPlane (GL_CLIP_PLANE0, eqn);
glEnable (GL_CLIP_PLANE0);
glRotatef (-90.0, 1.0, 0.0, 0.0);
auxWireSphere(1.0);
glPopMatrix();
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGB);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Arbitrary Clipping Planes");
myinit ();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖8-13 剪取後的網狀半球體 |
圖8-14 視景體到視口的映射 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void drawPlane(void);
void CALLBACK elbowAdd (void);
void CALLBACK elbowSubtract (void);
void CALLBACK shoulderAdd (void);
void CALLBACK shoulderSubtract (void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
static int shoulder = 0, elbow = 0;
void CALLBACK elbowAdd (void)
{
elbow = (elbow + 5) % 360;
}
void CALLBACK elbowSubtract (void)
{
elbow = (elbow - 5) % 360;
}
void CALLBACK shoulderAdd (void)
{
shoulder = (shoulder + 5) % 360;
}
void CALLBACK shoulderSubtract (void)
{
shoulder = (shoulder - 5) % 360;
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
glPushMatrix();
glTranslatef (-0.5, 0.0, 0.0);
glRotatef ((GLfloat)
shoulder, 0.0, 0.0, 1.0);
glTranslatef (1.0, 0.0, 0.0);
auxWireBox(2.0, 0.2, 0.5);
glTranslatef (1.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.8, 0.0, 0.0);
auxWireBox(1.6, 0.2, 0.5);
glPopMatrix();
glFlush();
}
void myinit (void)
{
glShadeModel (GL_FLAT);
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glTranslatef (0.0, 0.0, -5.0); /* viewing transform */
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 400, 400);
auxInitWindow ("Composite Modeling Transformations");
myinit ();
auxKeyFunc (AUX_LEFT, shoulderSubtract);
auxKeyFunc (AUX_RIGHT, shoulderAdd);
auxKeyFunc (AUX_UP, elbowAdd);
auxKeyFunc (AUX_DOWN, elbowSubtract);
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖8-15 簡單機械手臂的符合運動 |
圖9-1 計算機顏色生成原理 |
圖9-2 RGB色立體 |
後綴 | 數據類型 | 最小值 | 最小值映射 | 最大值 | 最大值映射 |
b | 1字節整型數 | -128 | -1.0 | 127 | 1.0 |
s | 2字節整型數 | -32,768 | -1.0 | 32,767 | 1.0 |
i | 4字節整型數 | -2,147,483,648 | -1.0 | 2,147,483,647 | 1.0 |
ub | 1字節無符號整型數 | 0 | 0.0 | 255 | 1.0 |
us | 2字節無符號整型數 | 0 | 0.0 | 65,535 | 1.0 |
ui | 4字節無符號整型數 | 0 | 0.0 | 4,294,967,295 | 1.0 |
表9-1 整型顏色值到浮點數的轉換 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
void myinit(void);
void InitPalette(void);
void DrawColorFans(void);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_FLAT);
}
void InitPalette(void)
{
GLint j;
static GLfloat rgb[][3]={
{1.0,0.0,0.0},{1.0,0.0,0.5},{1.0,0.0,1.0},{0.0,0.0,1.0},
{0.0,1.0,1.0},{0.0,1.0,0.0},{1.0,1.0,0.0},{1.0,0.5,0.0}};
for(j=0;j<8;j++)
auxSetOneColor(j+1,rgb[j][0],rgb[j][1],rgb[j][2]);
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-12.0,12.0,-12.0*(GLfloat)h/(GLfloat)w, 12.0*(GLfloat)h/(GLfloat)w,-30.0,30.0);
else
glOrtho(-12.0*(GLfloat)h/(GLfloat)w, 12.0*(GLfloat)h/(GLfloat)w,-12.0,12.0,-30.0,30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CALLBACK display(void)
{
InitPalette();
DrawColorFans();
glFlush();
}
void DrawColorFans(void)
{
GLint n;
GLfloat pp[8][2]={
{7.0,-7.0},{0.0,-10.0},{-7.0,-7.0},{-10.0,0.0},
{-7.0,7.0}, {0.0,10.0},{7.0,7.0},{10.0,0.0}};
/* draw some filled_fan_triangles */
glBegin(GL_TRIANGLE_FAN);
glVertex2f(0.0,0.0);
glVertex2f(10.0,0.0);
for(n=0;n<8;n++)
{
glIndexi(n+1);
glVertex2fv(pp[n]);
}
glEnd();
}
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_INDEX);
auxInitPosition(0,0,500,500);
auxInitWindow("Color Index");
myinit();
auxReshapeFunc(myReshape);
auxMainLoop(display);
}
圖9-3 自定義調色板 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Simple Lighting");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖10-1 帶光影的灰色球體 |
pname 參數名 | 缺省值 | 說明 |
GL_AMBIENT | (0.0, 0.0, 0.0, 1.0) | RGBA模式下環境光 |
GL_DIFFUSE | (1.0, 1.0, 1.0, 1.0) | RGBA模式下漫反射光 |
GL_SPECULAR | (1.0,1.0,1.0,1.0) | RGBA模式下鏡面光 |
GL_POSITION | (0.0,0.0,1.0,0.0) | 光源位置齊次座標(x,y,z,w) |
GL_SPOT_DIRECTION | (0.0,0.0,-1.0) | 點光源聚光方向矢量(x,y,z) |
GL_SPOT_EXPONENT | 0.0 | 點光源聚光指數 |
GL_SPOT_CUTOFF | 180.0 | 點光源聚光截止角 |
GL_CONSTANT_ATTENUATION | 1.0 | 常數衰減因子 |
GL_LINER_ATTENUATION | 0.0 | 線性衰減因子 |
GL_QUADRATIC_ATTENUATION | 0.0 | 平方衰減因子 |
表10-1 函數glLight*()參數pname說明 |
圖10-2 Gouraud明暗處理 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void object(void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
/* GL_SMOOTH is actually the default shading model. */
void myinit (void)
{
glShadeModel (GL_SMOOTH);
}
void object(void)
{
glBegin (GL_POLYGON);
glColor3f (1.0, 0.0, 0.0);
glVertex2f (4.0, 4.0);
glColor3f(1.0,1.0,1.0);
glVertex2f (12.0, 4.0);
glColor3f(0.0,0.0,1.0);
glVertex2f (12.0, 12.0);
glColor3f(0.0,1.0,0.0);
glVertex2f (4.0, 12.0);
glEnd ();
}
void CALLBACK display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
object ();
glFlush ();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (0.0, 16.0, 0.0, 16.0 * (GLfloat) h/(GLfloat) w);
else
gluOrtho2D (0.0, 16.0 * (GLfloat) w/(GLfloat) h, 0.0, 16.0);
glMatrixMode(GL_MODELVIEW);
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Smooth Shading");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖10-3 高氏明暗處理的正方形 |
參數名 | 缺省值 | 說明 |
GL_AMBIENT | (0.2, 0.2, 0.2, 1.0) | 材料的環境光顏色 |
GL_DIFFUSE | (0.8, 0.8, 0.8, 1.0) | 材料的漫反射光顏色 |
GL_AMBIENT_AND_DIFFUSE | 材料的環境光和漫反射光顏色 | |
GL_SPECULAR | (0.0, 0.0, 0.0, 1.0) | 材料的鏡面反射光顏色 |
GL_SHINESS | 0.0 | 鏡面指數(光亮度) |
GL_EMISSION | (0.0, 0.0, 0.0, 1.0) | 材料的輻射光顏色 |
GL_COLOR_INDEXES | (0, 1, 1) | 材料的環境光、漫反射光和鏡面光顏色 |
表10-2 函數glMaterial*()參數pname的缺省值 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void); void myinit(void)
{
/* 設置材質的各類光的顏色成分反射比率 */
GLfloat mat_ambient[]={0.8,0.8,0.8,1.0};
GLfloat mat_diffuse[]={0.8,0.0,0.8,1.0}; /* 紫色 */
GLfloat mat_specular[] = { 1.0, 0.0, 1.0, 1.0 }; /* 亮紫色 */
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH16);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Lighting_1 ");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
#include "glos.h"
#include <GL/gl.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
GLfloat mat_ambient[]= { 0.8, 0.8, 0.8, 1.0 };
GLfloat mat_diffuse[]= { 0.8, 0.0, 0.8, 1.0 }; /* 紫色 */
GLfloat mat_specular[] = { 1.0, 0.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_diffuse[]= { 0.0, 0.0, 1.0, 1.0}; /* 藍色 */
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
auxSolidSphere(1.0);
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH16);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("Lighting_2 ");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖10-4 光照藍色球(高光爲紅色) |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK display(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
/* 初始化z-buffer、光源和光照模型,在此不具體定義材質。*/
void myinit(void)
{
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };
GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glClearColor(0.0, 0.1, 0.1, 0.0);
}
void CALLBACK display(void)
{
GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat no_shininess[] = { 0.0 };
GLfloat low_shininess[] = { 5.0 };
GLfloat high_shininess[] = { 100.0 };
GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* 第一行第一列繪製的球僅有漫反射光而無環境光和鏡面光。*/
glPushMatrix();
glTranslatef (-3.75, 3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第一行第二列繪製的球有漫反射光和鏡面光,並有低高光,而無環境光 。*/
glPushMatrix();
glTranslatef (-1.25, 3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第一行第三列繪製的球有漫反射光和鏡面光,並有很亮的高光,而無環境光 。*/
glPushMatrix();
glTranslatef (1.25, 3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第一行第四列繪製的球有漫反射光和輻射光,而無環境和鏡面反射光。*/
glPushMatrix();
glTranslatef (3.75, 3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
auxSolidSphere(1.0);
glPopMatrix();
/* 第二行第一列繪製的球有漫反射光和環境光,而鏡面反射光。*/
glPushMatrix();
glTranslatef (-3.75, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第二行第二列繪製的球有漫反射光、環境光和鏡面光,且有低高光。*/
glPushMatrix();
glTranslatef (-1.25, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第二行第三列繪製的球有漫反射光、環境光和鏡面光,且有很亮的高光。*/
glPushMatrix();
glTranslatef (1.25, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第二行第四列繪製的球有漫反射光、環境光和輻射光,而無鏡面光。*/
glPushMatrix();
glTranslatef (3.75, 0.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
auxSolidSphere(1.0); glPopMatrix();
/* 第三行第一列繪製的球有漫反射光和有顏色的環境光,而無鏡面光。*/
glPushMatrix();
glTranslatef (-3.75, -3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第三行第二列繪製的球有漫反射光和有顏色的環境光以及鏡面光,且有低高光。*/
glPushMatrix();
glTranslatef (-1.25, -3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第三行第三列繪製的球有漫反射光和有顏色的環境光以及鏡面光,且有很亮的高光。*/
glPushMatrix();
glTranslatef (1.25, -3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
auxSolidSphere(1.0);
glPopMatrix();
/* 第三行第四列繪製的球有漫反射光和有顏色的環境光以及輻射光,而無鏡面光。*/
glPushMatrix();
glTranslatef (3.75, -3.0, 0.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
auxSolidSphere(1.0);
glPopMatrix();
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= (h * 2))
glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,
3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),
6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
auxInitPosition (0, 0, 600, 450);
auxInitWindow ("Material");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖10-5 多種光和材質的變化效果 |
#include "glos.h"
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void myinit(void)
{
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void CALLBACK display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* draw one yellow ball */
glLoadIdentity();
glTranslatef(-0.7,0.0,0.0);
glColor3f(1.0,1.0,0.0);
auxSolidSphere(0.5);
/* draw one red cone */
glLoadIdentity();
glRotatef(-65.0,1.0,0.0,0.0);
glTranslatef(0.7,0.0,0.0);
glColor3f(1.0,0.0,0.0);
auxSolidCone(0.4,0.6);
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
else
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main(void)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGB | AUX_DEPTH16);
auxInitPosition (0, 0, 500, 500);
auxInitWindow ("ColorMaterial Mode");
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}
圖10-6 漫反射材質改變 |
(4):個人解法
過程 :
進行視角變換;
進行整數化;
進行鄰域填補(也叫膨脹算法);
進行正射投影;
檢索二維矩陣;
逆向分析,根據相機參數和透視關係,還原單側視圖;
算法代碼:
未完待續............................