2011年5月14日 星期六

作業4 3D場景悠遊

主題介紹

步行於元智的夜晚



過程與成果展示

這次的作業,參考了老師的範例17,載入物件的部分

但網路上可以用的obj實在太少了

不然就是可以用的都要錢...

最後我就參考了範例17裡面其中一個obj

然後慢慢修改,做出一到七館( building1.obj ~ building7.obj )

把.mtl的部分拿掉,讓顏色那些也自己設定

每個館都是用物件的方式載入

glMaterialfv(GL_FRONT, GL_DIFFUSE, matn_diffuse);
glPushMatrix();
       glTranslated(x,y,z);
       glRotatef(angle, 0.0, 1.0, 0.0);
       glCallList( list_idn );
    glPopMatrix();

使用gluLookAt讓程式可變化個角度來看元智

初始視角設在(20, 0, 0) 面對六館方向


延續上個作業用到的,加上光源與材質,我將光源設在(0, 10, 0)處

寫在prepare_lighting函式中

光是放上一到七館,就花了滿多時間了

可能是自己空間概念不夠好

加上Z軸之後,腦筋就一直轉不過來

幸好拿出紙筆標記在紙上之後

就解決這個困擾了


接著我在各館間的空隙處利用迴圈加上了樹

以及幫紅磚道上色,在二三館間加了恐龍蛋 (二一石)


後來我覺得,各館雖然都有自己的外型了

但是都是很光滑的同一色系,好像有點單調

看到很多人在作業一就運用了貼圖

於是我也開始學習要怎樣貼圖


參考了以上網頁以及老師的範例

根據網友的建議

以64*64,或256*256的bmp是最好的,接著我便開始收集圖片

本來想要貼上各館外觀的照片

可是貼上去變好醜


所以我就去網頁素材的網站,找了一些適合的圖

用小畫家改成64*64的bmp

先利用AUX_RGBImageRec 來開一個檔案

LoadGLTextures 將Load的檔案,轉換成Textures

glGenTextures 創造Textures

接著再產生Texture

利用glTexImage2D將圖片貼在物件上





貼圖的code是參考老師的範例的

在依照自己的需求做修改這樣


貼完圖之後,作業終於看起來比較順眼一點了

雖然看起來只是變個顏色而已

其實每個館貼的圖是有花紋的

不過可能我設得太小,所以看不太出來

如果將館放超級大的話,就可以看得比較明顯唷 :)




因為紅磚道上看起來有點空虛單調

所以我又載入了人的物件

他長得真的很壯欸,我一開始還放大三倍載入,結果自己嚇了一大跳 XD


縮小之後

再用Loop等,讓他各角度都產生行人

( 有些要進七館,有些往宿舍方向,有些要去一館... )


用俯視角來看看元智吧






最後在天空中加上了月亮,以及隨機產生星星

月亮是用上一個作業的 glutSolidSphere 做法畫出的

而星星也是用 glutSolidSphere 畫出,不過是將半徑設為 0.01

所以看起來很像一個小點點


以下是我這次作業的架構



KeyboardFunc( )的部分

a,d控制視野z方向

w,x控制視野x方向

q,e則可控制仰視及俯視

簡單來說

就是面對六館的時候 ( 初始 )

a,d可左右移動

w,x可前進後退

q,e可看仰視及俯視

為了方便起見

利用SpecialFunc( )

↑ , ↓ 控制視野z方向,也就是面對六館時可前進後退 

← , → 控制視野x方向,面對六館時可左右移動

最後加上按下Esc可關閉視窗


心得與討論

遇到最大的問題

一開始我是用Visual Studio 2008

在執行到 return auxDIBImageLoad(Filename); 這一行code會一直出錯

我幾乎是遍了所有網路上提供的方法

1. 改成 return auxDIBImageLoad(_L("xxx.bmp"));

2. 加入#pragma comment(lib, "glaux.lib")

3. 加入#define auxDIBImageLoad auxDIBImageLoadL

4. 專案→屬性→連結器→輸入→加入glaux.lib

5. 直接去下載glaux.lib到lib的資料夾內,在link

6. 不使用unicode




.
.
.

繁多不及備載


我試了一整個晚上,以上方法全部都不行!!!!!!

在這些過程中,為了載glaux.lib這個檔案

電腦還不知道怎麼了,瘋狂安裝很奇怪的東西

嗚嗚~千萬不要連不熟悉的網頁亂下載東西 QQ

就在我終於把亂安裝的東西都解除安裝之後

google到有一位網友說,glaux.lib在v5.0的資料夾內有...

當下真的很想乾脆不要貼圖直接交作業算了

但看到很多同學都會貼圖,自己真的也很希望可以嘗試成功

就在我快要絕望之際

看到了曾經修過圖學的同學上線

厚著臉皮問他我這個Error要怎麼辦

他告訴我,VS2008"似乎"沒有支援glaux,叫我改用VC6或Dev c++寫

他也很好心的提供了老師之前提供的CGMyDemo這份範例給我

於是,在Dev中安裝了glut,glaux套件之後

我終於搞定之前的Error了

這個當下,用痛哭流涕來形容真的一點都不為過



只是我真的很想知道,VS2008真的不能用嗎

因為有問到之前曾經修過的同學

他說他的VS2008只要Link lib就可以用了

到底為什麼我的不行 QAQ

這個問題真的是我這次作業的最大難題了

也耗了最多時間在解決



另外遇到的問題就是

不知道為什麼

如果我把Mydisplay裡面的一館到七館

移到Mydisplay最前面,紅磚道會因為鍵盤中任何一個觸發點而變成黑磚道

但放在後面就可以正常顯示

這個奇怪的問題還要再花時間想想辦法吧



作業越來越多元,做出來也越來越有成就感

雖然跟其他同學比起來還是差了一截

但希望自己可以保有這種感覺

讓作業慢慢上手

:)

========================
後記

作業是在家中完成的,但家裡電腦CPU不夠好

變成動得很慢

想說到學校來再把畫面拍成影片上傳

結果一打開

變成....


真不知道是不是因為我沒有裝顯卡,直接用內顯的關係

所以行人就變成沒有穿褲子了

好害羞 >///<

為了大家好,就不拍成影片了 

:P

沒有留言:

張貼留言