打光
事前提要:
1. 要注意電腦上的codeblocks上面是有裝圖學要用的MinGW編譯環境,並且將相關設定都設好
複習:
複習上周的移動轉動縮放的各種exe檔,以及遇到錯誤時應該如何處理
還有如何自己做出一個和範例檔一樣的執行檔出來
打光
打開上周的week05.cbp,會看到原本只有三大函式(左),而原本結果也是一張黑底白圖(右)而已

現在要把它變成有顏色的模型
首先先加上兩行程式碼(打光=>LIGHT)
可以加在display()中(但是因為會每一次畫的時候重複執行,所以會比較慢一點),也可以加在main()中
glEnable(GL_LIGHTING);//偷來的打光 這是整個的打光效果
glEnable(GL_LIGHT0);//偷來的打光 整個只會打在第0盞 (有很多盞可以開)
glLightfv(GL_LIGHT0, GL_POSITION, pos); //這是打光位置 浮點數 向量
GLfloat pos[] = { 0.0, 0.0, -1.0, 0.0 }; //這個要宣告在main()外面
結果執行結果是殘缺的QAQ

原因是沒有遠近(深度)、前後等等關係
glEnable(GL_DEPTH_TEST); //這行是3D深度測試, 打開Enable
然後再執行一次,就有完整的背影了!!!

➧但是為什麼可以這樣用深度測試呢?
因為在之前的程式碼中,這行⇩原本就有幫深度準備好buffer記憶體了
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
然後還有這行⇩會清深度的buffer使繪圖能正確
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
現在要加滑鼠互動拉~
先在main()中加上:
glutMouseFunc(mouse); //這是控制滑鼠
glutMotionFunc(motion); //可以讓滑鼠有拖曳 mouse motion (dragging)
glutKeyboardFunc(keyboard); //這是控制鍵盤
再來一步步寫一下這三個的函式:
➤首先是鍵盤
int rotateX=0, rotateY=0, rotateZ=0; //這是個軸旋轉值,一開始設為0
void keyboard(unsigned char key, int x, int y)
//key是指你輸入的字是甚麼,x和y則是現在位置在哪裡
{
printf("now: %c (%d %d)\n", key, x,y); //註一
if(key=='1') rotateX++; //如果我輸入1,旋轉軸x會增加
if(key=='2') rotateY++;
if(key=='3') rotateZ++; //註二
glutPostRedisplay(); ///這行就是我按一個鍵她就會馬上重跑一次不會卡卡
//如果想要讓他也可以反向旋轉,可以再加上4 5 6然後用--
}
註一:
我剛剛在圖中標a的點上用鍵盤輸入了一個a,然後黑框框中就出現a和滑鼠的現在位置;b也是

註二:
為了測試這三行的效果(但是無論如何還是要做),我們搬出上周教的⇙放在diaplay()
glPushMatrix();
glRotatef(rotateX, 1,0,0);
glRotatef(rotateY, 0,1,0);
glRotatef(rotateZ, 0,0,1);
drawmodel();
glPopMatrix();
執行後,在我狂按了一堆1後,可以清楚明顯的看到框框中的物體旋轉了!

➤再來是滑鼠
int oldX=0, oldY=0; //一開始old應該要設定沒有值
void mouse(int button, int state, int x, int y)
//button是決定滑鼠的左鍵右鍵,state決定是往上還是往下 註一
{
printf("button:%d state:%d (%d %d)\n", button, state, x, y);
//把大象放到冰箱去: (1) 把冰箱門打開, (2) 把大象放進去, (3) 把冰箱門關起來
//mouse drag: (1) mouse down, (2) drag, (3) mouse up
if(state==GLUT_DOWN) //如果滑鼠往下,我要開始拖曳
{
oldX=x;
oldY=y;
}
}
註一
當button=0的時候表示我按左鍵,2的時候表示我按右鍵
當state=0得時候表示我按下滑鼠(往下),1的時候表示滑鼠案件放開(往上)

➤最後是滑鼠拖曳
void motion(int x, int y) //這個就是滑鼠拖曳要用的
{
rotateY += -(x-oldX);
rotateX += -(y-oldY);
oldX=x; oldY=y;
glutPostRedisplay();
}
有了motion之後,就可以看到我只要按著滑鼠,拉,放開,他就可以拖曳很多了

作業:
作業是要自己做出個可以移動旋轉的物體
然後要錄成影片~可以有介紹文=D
--------------------------------------------------------------------------------------------------------
其他備註:
*原本打光應該要這樣寫:
glEnable(GL_LIGHTING); //要有開燈
glPushMatrix();
glMultMatrixd(inverse);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glPopMatrix();
drawmodel();
glDisable(GL_LIGHTING); //然後關燈
應該每一次要用都要打開關起來,不過我們好像不要這麼麻煩,打開就不要關了
*中間老師講了一些關於系統程式的東西,有點多所以直接附上影片網址😇
https://www.facebook.com/jsyeh.org/videos/oa.125234311517581/1752149428131206/?type=3
沒有留言:
張貼留言