2012年4月30日 星期一

HW2

HW 2
一、主題介紹︰ 3D物件繪製與呈獻(元智一館)


二、過程與展示︰

 這次總算作了一個簡易的3D建模,至於相似度嘛,就別太計較了。
為了建立一個基本的模組和視角,花了我很多的時間。
建立好之後,開始讓他自動旋轉方便debug (視覺上的),這次總算讓我學會畫圓柱了
只要用
GLUquadricObj *quadratic;
quadratic=gluNewQuadric();
gluCylinder(quadratic,1.6f,1.6f,3.0f,32,32); 
就可以畫出來了。

但是創出來的卻是橫躺在(0,0,0)的圓柱體,所以也一併學了
glTranslatef(-3.5f,1.4f,0.0f);
glRotatef(90, 1.0, 0.0, 0.0);
移動並旋轉到我指定的位置

之後在移動並旋轉回(0,0,0)創造物件主體。


創造物件時,會有後景蓋前景的狀況,也就是深度depth沒設定好得問題。
這個問題讓我不斷的翻閱老師給的z buffer參考範例
結果問題超級好解決,只要在繪圖前,加入函式glEnable(GL_DEPTH_TEST);
便會自動計算深度,避免這種覆蓋狀況。

剩下的,就是不斷地裝飾主體,但這部份真的很多,畫得有點不耐煩,只好簡單裝飾就給他過去嚕~~~

完成後,把自動旋轉關掉,改成用鍵盤輸入的旋轉。
主要控制為wasd,要使用旋轉的話,主要函式就是glRotatef(角度,x,y,z);
角度的部份設成變數,每次按鍵輸入一次便會改變角度的變數,就旋轉嚕~~~

以下為完成品展示圖






三、心得與討論︰
 這次程式主要是學會建立一個3D模型,但深度的問題真的讓我搞得很頭大,
像是
glPushMatrix();//放入矩陣
glRotatef(tngle, 1.0, 0.0, 0.0);//旋轉
glEnable(GL_DEPTH_TEST);//深度測試
cube();//繪物件
glPopMatrix(); //拿出矩陣
glutSwapBuffers();//交換成預先作的buffer

這個使用過程,就和第一隻程式完全不同

設定防止物體隨視窗變形的函數
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}

主函式main的宣告內容也不同
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutReshapeFunc (reshape);

使用下來還是有不少不太順手的地方
整個都是學習新的東西,要熟練的話,大概還要再幾隻程式的練習才足夠。

以上。

沒有留言:

張貼留言