主題介紹
在元智生活了三年半,轉眼間已經大三了,身為資工人每天都會待的地方就是元智一館,元智一館可說是我們資工人的家,所以作業一主要是利用一些OpenGL基本繪圖元件來將我們心中的元智一館呈現出來。
設計概念
由於不同的視角所看到的一館呈現會有不同的效果,而其中從五館俯視一館的角度我覺得是最清楚且最能呈現一館風格的角度,所以我從網路找了一張以此種角度作拍攝的照片(下面會呈現),來當我的參考圖,再根據參考圖作場景描繪。
執行成果呈現
左圖為參考照片,右圖為成果圖
成果放大圖
程式設計
1. 選擇投影的方式
OpenGL的viewing volume一開始預設是 -1到 1之間,要在預設值範圍內畫出場景,每個頂點座標都必須到小數點後幾位才可以達到精確的效果,為了改善這種情況,我選擇了正交投影 ( glOrtho) ,來改變我的viewing volume。
2. 改變照相機的位置
由於我整個場景最左下角是以0為基礎開始描繪,這時候會發生整個影像都會呈現在螢幕右上方的情形,原因是因為OpenGL的照相機位置一開始預設是照在座標( 0.0 , 0.0, -1.0),所以為了使我的影像最後可以呈現在整個螢幕的正中央,我使用gluLookat來改變照相機的設定。
3. 其餘的程式部份
除了上述兩點以外,其他部份的code我直接參考老師portal的範例1和2來做設定,並把最後呈現的視窗大小(glutInitWindowSize),改成我的viewing volume的1.5倍大。
為了有效率描繪整個場景,我描繪的順序是先描繪大範圍物體,等整個一館的外觀差不多呈現以後,再做細部的處理。
1. 描繪出整個一館的基本架構
2. 描繪柱子和房子線條
3. 描繪窗戶的基本雛型
4. 描繪出窗戶雛型的第二版
5. 描繪天空和草地
6. 描繪地板、階梯和路燈
7. 為了逼真一點,描繪幾棵樹上去
8. 最後再把所有的窗戶細部畫,大功告成
心得與討論
這次的作業起初以為只要直接把物件畫上去就可以呈現出來,所以ㄧ開始是在範圍-1到1之間作描繪,每個頂點都要算到小數點後幾位,光畫ㄧ個矩形可能就要算很久的時間,很沒效率。後來才知道還要設定投影和照相機才可以把整個場景改變,減少我在測量描繪物體座標的時間。
單純的把物體畫出來的效果看起來很不真實,所以在每個polygon的頂點都需要改變顏色,這樣描繪出來的polygon會有漸層,也就是有點陰影的效果。ㄧ開始我用的是glColor3f,所以必須把每個顏色的值,用比例方式縮到0到1之間,使用起來整個很麻煩,後來隔ㄧ週上課才知道還有glColor3ub函式可以用,所以我想用什麼顏色,直接就能把0~255之間的數字代進去,不用在算比例了。
而場景中的樹的部份,ㄧ開始我是直接用三角形去畫,不過看起來也很不真實,後來想到老師上課有使用glutSolidTeapot的內建函式來畫茶壺,翻了一下書,找到glutSolidSphere這個可以內鍵畫出ㄧ顆球的函式,之後再把描繪球的參數改小一點,看起來就有點像樹的效果了! 而因為內建函式描繪出來的圖形ㄧ開始都是設在原點處,所以我在畫出樹以後,利用glTranslatef把它移動到我想要的場景位子,有些長長的樹是運用glScalef來達到縮放的效果。
最後我覺得這次的作業雖然花了很多時間,但是也學到很多東西,而也在整個寫作業過程中思考如何ㄧ步ㄧ步簡化我的code,也能達到很真實的效果,希望能運用在將來的作業上。