2012年6月17日 星期日

作業5 3D動畫程式-My Room

a)     作業要求:
這次作業老師希望盡我們所學時做出Lignting, Texture Mapping, Object Loading, Transformation and Viewing,因為我必較沒有創意,也想不出
什麼有趣的題目,毅然決然地依照作業要求實作出我的房間。
b)     實作過程:
            1.     Lighting :
在這一次作業中,我終於知道原來是我沒有做貼圖導致我作業四的燈光總是那麼暗。至於實作lighting的部分主要是利用以下function來實作。
            float light_diffuse[4] = {1.0, 1.0, 1.0, 1.0};  //散射光
            float light_ambient[4] = {1.0, 1.0, 1.0, 1.0};  //環境光
            float light_specular[4] = {0.5, 0.5, 0.5, 1.0}; //全反射光
float light_position[4] = { 0 , 100, 0, 1.0 };  //位置
2. Texture Mapping:
這是我作業四沒實做出來的部分。這次的牆壁、天花板與地板都是用texture mapping實作,主要還是藉由老師的範例程式慢慢修改而來。
先利用老師給的function讀入 .bmp檔:
bool Load_Texture(unsigned int & aTexture, char * fileName){
if(!fileName) return false; //if no file name is given return

FILE *aFile = NULL;
AUX_RGBImageRec *image_record = NULL;

if((aFile = fopen(fileName, "rb")) == NULL) return false;

image_record = auxDIBImageLoad(fileName); //Function to load BMP

if(!image_record) return false; //check that BMP loaded

glGenTextures(1, &aTexture); //generates 1 texture name

glPixelStorei (GL_UNPACK_ALIGNMENT, 1); //sets how the pixels of the texture are stored

glBindTexture(GL_TEXTURE_2D, aTexture); //binds the name to the target


//build prefiltered textures at different resolutions
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image_record->sizeX,
image_record->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image_record->data);

//give the texture its attributes
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

// Now we need to free the image data that we loaded since openGL stored it as a texture
if (image_record) { //if we stored data then free the memory
if (image_record->data) { //check if there is any data
free(image_record->data); //free the memory
}
free(image_record); //free the image record
}

return true; //everything should have worked so return true
}


Load_Texture(texture[0],"floor_texture.bmp");

再將圖貼上去
glPushMatrix();

glColor3f(1.0f,1.0f,1.0f); //Set colour to White
glEnable(GL_TEXTURE_2D); //Enable texture mapping
glDisable (GL_DEPTH_TEST); //Disable depth testing
glDisable (GL_LIGHTING);
//before you can use a texture you have to bind it
glBindTexture(GL_TEXTURE_2D, texture[0]);

glBegin(GL_POLYGON);
glTexCoord2f(0.0, 1.0);
glVertex3f(-10,0,10);

glTexCoord2f(1.0, 1.0);
glVertex3f( 10,0,10);

glTexCoord2f(1.0, 0.0);
glVertex3f(10,0,-10);

glTexCoord2f(0.0, 0.0);
glVertex3f(-10,0,-10);
glEnd();

//Re-Enable the depth test
glEnable(GL_DEPTH_TEST);
//disable texture mapping
glDisable(GL_TEXTURE_2D);
glEnable (GL_LIGHTING);
glPopMatrix();

     3.Obj Loading :
               這次作業裡所有的模型都是利用obj loading讀進來的。載入obj檔方法如下:
               要貼物件必須先include"glm.h",然後

GLMmodel *glm_model;
glm_model= glmReadOBJ( "tree.obj" );//讀該物件
glmUnitize( glm_model );
glmScale( glm_model, .2 );//控制大小
glmFacetNormals( glm_model );
glmVertexNormals( glm_model, 90 );
list_id[0] = glmList( glm_model, GLM_MATERIAL | GLM_SMOOTH );
glmDelete( glm_model );



再利用glCallList( list_id[0]);就能載入物件了。


        4.Transformation and Viewing :
           遊走的部分是利用gluLookAt()來實作完成。
           glTranslatef()來將物件translate到你要的座標軸位置。


c)    心得:
       這次作業把自己這學期的所有topic都實作過了一次 ,雖然作品很陽春,但感覺還蠻扎實的      
           
     

2012年6月11日 星期一

HW4

a)實作與過程
   這次作業主要是延續上一次作業而來,首先我先去下載了一棵樹的.obj檔,範例圖片這棵樹是  彩色的但是載入後卻只有灰階。載入obj檔方法如下:
要貼物件必須先include"glm.h",然後

GLMmodel *glm_model;
     glm_model= glmReadOBJ( "tree.obj" );//讀該物件
     glmUnitize( glm_model );
     glmScale( glm_model, .2 );//控制大小
     glmFacetNormals( glm_model );
     glmVertexNormals( glm_model, 90 );
     list_id[0] = glmList( glm_model, GLM_MATERIAL | GLM_SMOOTH );
     glmDelete( glm_model );   

 再利用glCallList( list_id[0]);就能載入物件了了。

接下來就是實作打光,方法如下:


  float light_diffuse[4] = {1.0, 1.0, 1.0, 1.0};  //散射光 
  float light_ambient[4] = {1.0, 1.0, 1.0, 1.0};  //環境光 
  float light_specular[4] = {0.5, 0.5, 0.5, 1.0}; //全反射光 
  float light_position[4] = { 0 , 100, 0, 1.0 };  //位置


但是打光後,所有的建築都變成了灰黑,查完資料後發現原來是沒有貼材質的原因。


這次因為時間不夠,沒有把貼材質實作出來。




b)心得


這次貼圖沒實作出來實在很可惜,希望下次十座可以完美的呈現出材質。





2012年5月21日 星期一

[作業三]3D校園遊走






a)作業要求:
這次作業要求我們利用OPENGL實作出3D由有程式,這次的作業主要是利用老師給的範例修改而來。
b)實作部分:
首先我先利用GL_POLYGON將一館的正方體畫出,原本打算每個館都火大利用GL_POLYGON畫完,沒想到突然發現了glutSolidCube()可以直接畫出一個cube並且利用:
1.      glScalef()來縮放cube
2.      glTranslatef()來將物件translate到你要的座標軸位置。
3.      glRotatef()來旋轉物件。
至於遊走的部分是利用gluLookAt()來實作完成。
c)遇到的困難
1. 一開始我使用glOrtho()來設定座標系,結果整個畫面扭曲且利用GL_POLYGON畫出來的每個面會隨著移動而被拆解,勝至於亂跳,後來將glOrtho()改成gluPerspective()後一切順利。

d)心得
這次作業學的了如何在空間中遊走,如此一來可以更接近製作3D動畫/遊戲的LEVEL了。
[備註]
紅色 : 5
灰色 : 1
淺藍 : 6/2
綠色 : 3
黃色 : 7

2012年4月30日 星期一

[作業二]3D元資一館


a)作業要求:
這次作業要求我們利用OPENGL實作出3D元智一館,由於這次作業遇到了太多BUG,解玩BUG發現時間不多了,所以只做出了陽春的功能,沒有去畫細部。
b)實作部分:
與第一次作業雷同,我先在紙上描繪出座標再利用GL_POLYGON一一畫出。此外這次作業還用到了:
glutSpecialFunc()來設定當使用者按上下左右鍵時物件如何旋轉。
glRotatef()來設定轉軸與旋轉角度。
glOrtho()來更改座標系,才不會每次在紙上量到的座標都要除100(default 座標是 -1 ~ 1)
c)遇到的困難
1.一開始當我完成長方體時,前面那面都會被後面的那一面吃掉,導致永遠只出現後面那一面,後來蒐集了很多資料發現,只要增加glEnable(GL_DEPTH_TEST)就能解決這次問題。

2.接下來就是遇到圖形一直亂跳的窘境,後來把glFlush()整行註解掉後,畫面就順利的執行了。
d)心得
原本以為可以很順利的完成這次作業,沒想到竟然遇到一些無解的bug,卡了我許多時間,到最後只做出陽春的功能。下次作業真的要早點寫。



2012年3月19日 星期一

元資一館

主題名稱 : 元資一館
實作過程 : 
首先我利用紙筆將元智一館描繪在方格紙上,再將座標一一輸進 glVertex3f()這個函式劃出基本架構。

接下來微調各部分之角度,並繪畫出窗戶、凹區。並利用顏色的深淺與影子來增加其立體感。


最後在將3、4排窗戶補上,並做最後的微調與補上影子,就完成了這次的作業。

實作上的困難 :

這次實作此作品遇到最大的困難就是圓柱的部分,原本想用sin函式來實作,結果都一直出現下列的圖:
後來決定暴力破解,我把原著切成13個長方形,然後用座標慢慢描出來(感謝微積分老師 ~_~ )。

實作心得:
這是第一次接觸openGL,所以沒有辦法知道各種好方法來解決遇到的問題,期許自己下次在實作時能更加熟練,不要再用暴力破解(光圓柱就花了我1.5小時),最後補上手繪圖並再次呈現作品 ~_~。