2017年10月21日 星期六

楊喻文的學習手札 20171019

week06

打光

事前提要:
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














沒有留言:

張貼留言