2012年6月17日 星期日

HW5

一、主題介紹︰自訂主題3D動畫程式─神社


二、過程與成果展示
正面


側面


飛鷹(會動唷^.<)




三、心得與討論

這次重新load了新的背景,也自己找了很多新的模組來用。
但是在使用免費的模組時,其實有不少obj檔不知道為何都無法load進程式使用
大致上就是編譯通過,開啟程式約3秒後就關閉了,原因不明。

或是有些obj檔有額外的texture要載入使用,但OpenGL似乎並沒有支援此load的功能。
亦或是要我自己撰寫....

而我在看過一些texture mapping的範例之後,仍然無法使用將texture map到model上...
另外,還有其他的模型檔,.max、.fbx....在OpenGL上似乎都要另外使用函式庫支援。
因此在使用模組的選擇上,都盡量找靜態的物件使用.....
 而最後所完成的動畫, 就是一隻在天空飛翔的老鷹.....

OpenGL在許多設計上並不是很完善的支援其他格式的模組,在開發上過於困難。
在這裡所學得大部分都為基本的圖學程式應用。
希望在之後能碰到開發上比較方便的軟體時,能夠完成令自己滿意的作品。

2012年6月13日 星期三

HW4

一、主題介紹︰元智校園擬真3D空間場景


二、過程與成果展示

內部


由外往內看


 由外往內看2



三、心得與討論

這次為上一次的成果加上打光、貼背景材質和放模型。
打光的準備動作為

  float light_diffuse[4] = {1.0, 1.0, 1.0, 1.0};  // 定義燈光的反射值
  float mat_diffuse[4] = {1.0, 1.0, 1.0, 1.0};  // 定義多邊型表面的反射值
  float light_position[4] = { 0.0, 1.0, -1.0, 1.0 };  // 定義燈光的反射值
 
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);  //指定0號光源的反射係數
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);  //指定0號光源的位置
 
  glEnable( GL_LIGHTING );  //啟動光源
  glEnable( GL_LIGHT0 );  //啟動0號光源


而材質和模型的內容比較多,就先不貼了。
不過主要的動作大致上為,載入模型(材質),貼模型(材質)。

這次的練習對我也是全新的概念。
雖然都是載入→使用的動作,但這次還需要另外引進更多的函式。
例如#include "glm.h"、#include <GL\glaux.h>以及bool Load_Texture(unsigned int & aTexture, char * fileName)
以及在dev c的專案選項中,需要設定參數
把連結器用的參數設定為-lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32 -lglaux

如此才可以成功的編譯,當初在自己撰寫時,雖然參考了範例。
但怎樣都編譯不出來,直到我去檢查這些內容時才注意到。

 這次其實想利用Rotate的方式將模型換角度,但在實做時一直失敗就放棄了。
 而且模型其實有材質可以貼,但在嘗試貼材質時,也因為缺乏參考最後也沒有成功。

 雖然很多想加入的設定一直沒加進去,但這次都還不夠熟練
 只好重複找更多文件去參考學習一下,讓下次做得更好。

2012年5月20日 星期日

HW3

一、主題介紹︰元智3D校園




二、過程與成果展示
 俯瞰圖


正視圖




三、心得與討論


這次的作業主要使用了glutSolidCube(x)來生成物件,使用glScalef(x,y,z)來調整物件的size。
本來我還在使用基本的glVertex3f在繪圖,不過這樣實在是太沒有效率了,因此查詢資料得知可以使用此種方式快速生成物件。

同時學會另一種創造物件的格式

例如

glPushMatrix();
glColor3f(0.8, 0.8, 0.0);
glTranslatef(-5.5f,2.0f,-5.0f);
glScalef(3.0,2.0,3);
glutSolidCube(2);
glPopMatrix();

使用glPushMatrix()和glPopMatrix()的方式下,不用像以前,translate位移之後,又要translate回到原點,然後再translate到下一個地點生成物件。使用此格式可以個別的針對物件去做修改和創造,方便了許多。


而使用者在裡面可以使用WASD控制角度,使用↑↓←→控制移動。
WASD控制角度為HW2,使用旋轉的內容就不解釋了。
而在環境中移動方式,主要使用gluLookAt和向量數學的方式,去計算並改使用者的視角,使其有移動的感覺。

以上

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);

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

以上。

2012年3月19日 星期一

HW 1

一、主題介紹︰元智一館草圖





二、過程與成果展示

第一次用OpenGL來繪圖,大致上算是一隻練習基礎概念的程式,以畫線和繪製多邊型為主。
本來有打算在右下角畫一個圓弧的柱體,但我目前還沒辦法用迴圈的方式創造一個圓弧狀成長的數值,因此作罷。

本程式最主要讓我瞭解的,是使用向量的方式作圖,那些線段和多邊形讓我在紙本上反覆紀錄和運算了很多次。
完成品

 
手繪草圖
三、心得與討論

這次作業最讓我可惜的是沒畫出圓柱體,而且,雖然使用了3D向量函式作圖,但最終我仍然沒有做出3D模型,初學的我實在是太好高騖遠了。

也許我該重新複習線性代數了,複習用向量的方式算圖。

這次主要也玩了3個函式,分別是
1. glViewport(X,Y,Z);
2. glVertex3f(X,Y,Z);
3. glColor3f(X,Y,Z);

就glViewport來說,是限制之後繪圖所設定的視窗大小,跟主程式的視窗無關
而glVertex3f開始繪製的時候,真正要把glViewport視窗填滿的話,其實數值是2~-2才能填滿
但老師上課好像說是-1~1?
 glColor3f就是接下來繪製的顏色,主要為RGB。(1,1,1)是白,(0,0,0)是黑。

如果glViewport在玩熟一點,我覺得好像可以用另一種「填滿」的方式畫圖。


以上