2022年4月11日 星期一

*嗚嗚* Week08

 # week08

主題一:Week08 Light

今天的主題是打光。

打光範例:

1.至 jsyeh.org/3dcg10 下載windows.zip和data.zip,把解壓縮後的data資料夾放進解壓縮後的windows資料夾裡/打開Light & Material.exe範例

左下角可以切換material,左上角可以切換3D模型。

2.可以調整程式碼裡的數值,改變光的位置。


主題二:
實作程式碼:week08_light:要用程式碼寫出打光的效果。
上moodle下載freeglut,解壓縮放桌面,lib裡短的變更短(跟之前上課都一樣)
打開新GLUT專案,不要刪除原先的程式碼,複製到Notepad++取名為sample.cpp(要利用裡面的一些程式碼,做複製貼上。分別是打光的陣列&打光的函式)
把CodeBlocks裡的程式全部刪掉,並貼上之前上課簡單的10行茶壺程式。
在void display()前面宣告打光的陣列,把從sample.cpp裡偷的程式碼複製貼上。

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

在glutMainLoop()之前,把從sample.cpp裡偷來的打光函式複製貼上

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

完成程式撰寫,輸出結果為:
因為打光的光線不是很明顯,我們要調整光的位置。
在打光陣列裡const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f }(第三個正5,z的值改變至負5,改變打光的位置。)
在void display()裡加上glColor3f(1,1,0)把茶壺變成黃色,結果就會更漂亮了!
結果如下:

在glutCreateWindow("week08 Light");創建視窗前可以設定視窗的形式
    glutInitWindowSize(300,300); 視窗的大小
    glutInitWindowPosition(100,300); 視窗在螢幕上的顯示位置
在glutCreateWindow("week08 Light");創建視窗後,才可以執行OpenGL指令
    glutMainLoop();主迴圈,程式可以繼續進行,不會結束。
介紹打光與Normal法向量之間的關係&介紹3D模型檔裡面的英文代表的意思。glNormal3f(nx,ny,nz)
期中模擬考系統:網址:jsyeh.org/gl/opengl_10_func.html
1.  glPushMatrix();//備份矩陣 (得到10分)
2.    glTranslatef(x,y,z);//移動 (得到10分)
3.    glRotatef(角度,x,y,z);//轉動   (得到10分)
4.    glScalef(x,y,z);//放大縮小   (得到10分)
5.   glBegin(GL_POLYGON);//開始畫 (得到10分)
6.    glVertex3f(x,y,z);//頂點  (得到10分)
7.    glColor3f(r,g,b);//色彩  (得到10分)
8.    glTexCoord2f(tx,ty);//貼圖座標 (得到10分)
9.    glNormal3f(nx,ny,nz);//打光的法向量 (得到10分)
10.  glEnd();//結束畫 
11. glPopMatrix();//還原矩陣 (得到10分)
最後有多一個主題,但下次上課會再講一次。

The End!





沒有留言:

張貼留言