主題介紹
資工一館 樂高版
這次的作業二跟作業一畫法不太不ㄧ樣,因為要畫出一館的每個面,所以我使用的方法有點像在堆積木、玩樂高的方式,慢慢的堆起來,才會每面都出現,而且有立體3D的感覺,因此我把這次作業定的名字就是,資工一館 樂高版。
設計概念
由於這次作業是要畫出整個一館的3D模型,因此每個面都需要畫出來,所以我跟同學借了相機拍了一館每個面的照片,再一一仔細描繪。
操作說明
可以對著畫面按下滑鼠右鍵,會跑出選擇操作的選單
可以對著畫面按下滑鼠右鍵,會跑出選擇操作的選單
1. 選擇rotate,可以使用鍵盤上下左右鍵,對模型進行旋轉,按上下鍵是對y軸作旋轉,左右鍵是對x軸作旋轉。
2. 選擇move,可以使用鍵盤上下左右鍵,對模型進行上下左右的移動。
3. 不管選擇哪個模式,按鍵盤的A(a)鍵可以對模型進行放大,按鍵盤的D(d)鍵
可以對模型縮小。
4. 選擇exit,就是直接關閉程式。
執行成果呈現
影片 (因為動太快,錄起來會失焦,所以我很緩慢的做旋轉移動和放大,請見諒)
而最後是想要呈現出,可以透過將模型移動和放大,讓使用者可以看清楚各個想看見的角度
而最後是想要呈現出,可以透過將模型移動和放大,讓使用者可以看清楚各個想看見的角度
1. 使用平行投影的效果
左面
程式設計
除了作業一寫的三個部分以外,作業二我多了以下幾個方法。
1. 使用 z-buffer algorithm
OpenGL有一個內建的z-buffer演算法,使用之後可以自動測試景深,如果被遮住的地方就完全不會畫出來,如此一來只要把Z軸位置設定好,就可以不用像作業ㄧ每次畫什麼物件還要考慮誰要先畫的問題。
2. 使用Reshape call back function
寫作業一的時候因為還沒學過這個function的用途,所以發現把視窗放大縮小後,整個影像的比例都亂掉了,因此這次寫了reshape call back function,只要視窗一改變,就會自動調整viewport和viewing volume,讓整個影像還是跟著視窗的比例作縮放。
3. Transformation和Keyboard call back function
為了能讓使用者看到整個3D模型的每個面,我使用剛學到的transformation方法,讓整個物體可以搭配keyboard call back function的輸入,作rotate(旋轉)、translate(移動)和scale(放大縮小)。
4. Menu function
為了可以調整操作模式,使用 menu function 搭配滑鼠右鍵作呼叫使用。
心得與討論
為了可以調整操作模式,使用 menu function 搭配滑鼠右鍵作呼叫使用。
心得與討論
這次的作業真的比作業一還要麻煩太多了! 光是一根柱子就要畫六個面,當然有些被檔住可以少畫幾個面。為了增加寫作的效率,我幾乎都把所有的座標位置寫在陣列裡面,另外再寫好六個面的Code,之後要畫的時候就複製一下把變數改一下就畫好一根柱子了,而寫在陣列裡面的好處是如果想要修改座標,只要簡單改一下陣列裡面的內容,其他code都不用動到,很好修改。
而描繪的過程,就有點像是小時候玩樂高一樣,先把整個主架構(大矩形)畫出來後,再慢慢的一根柱子,一塊地板的疊上去,必要時後還會再修改原本的架構矩形,有點像是挖洞一樣,挖好之後再繼續把想要的東西疊上去。
至於要選擇哪個投影的方式,是讓我最後最困擾的地方,我一開始都是平行投影的方法來寫,直到這禮拜老師講述 Frustum的方法,呈現出比較像人眼看到的效果,所以我也嘗試了一下發現真的看起來比較像,不過我最後上傳的作業還是以一開始的平行投影為主。
雖然整個寫作業的過程很複雜,花了很多時間,但是其實還蠻好玩的,當一根一根柱子疊出來,整個影像越來越像的時候,超級有成就感的,不過因為這次大部份的時間都花在如何作出逼真立體的模型,所以花在整個顏色調配上的時間就大為減少了,因此就單個面來講,感覺作業ㄧ看起來還是比較真實一點,這是我覺得這次比較可惜的地方。