2024年5月16日 星期四

BK Week13

 # week13


## week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

0. 下載 freeglut 至桌面, 並解壓縮, 更改 lib 中的檔名

1. 安裝 OpenCV

2. 重開 CodeBlocks, 改Setting - Compiler

3. Setting-Complier 要加入 OpenCV 相關的3個設定

    a. compiler 的 include 要加入 C:\OpenCV2.1\include

    b. linker 的 lib 要加入 C:\OpenCV2.1\lib

    c. linker 設定, 要加入 cv210 cxcore210 highgui210

4. 再把 GitHub 的程式倉庫下載下來

5. 更改 week12_3_glm_gundam_keyboard_angleID_mouse_motion_angle 目錄名

    為 week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

6. 更改 .cbp 檔的檔名為 week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

7. 再用 Notepad++ 開啟 .cbp檔, 

    改Title為 week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

8. 開啟 week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle

9. 先把float angle = 0, da = 1; 註解掉

9. 把 float angle = 0; 改成下面橘色部分

```cpp

    float angle [20] = {}; ///20個角度都設成0

    int angleID = 0; ///可以是角度0、角度1、角度2、......

    void motion(int x, int y){ 

        ngle [angleID] += y - oldY; /// 當我們的 mouse motion 時, y座標的對應角度

        oldX = x;

        oldY = y;

        glutPostRedisplay(); ///要重畫畫面

    }

    void mouse (int button, int state, int x, int y){

        oldX = x;

        oldY = y;

    }  

    void keyboard (unsigned char key, int x, int y){

        if(key=='0') angleID = 0;

        if(key=='1') angleID = 1;

        if(key=='2') angleID = 2;

        if(key=='3') angleID = 3;

    }

    void display()

    {

        glPushMatrix();

        ......

        glRotatef(angle[0], 0, 0, 1);

        ......

        glPushMatrix(); ///(0)

        ......

       glRotatef(angle[1], 1, 0, 0); 

       ......

    }

    int main(int argc, char*argv[])

    {

        glutKeyboardFunc(keyboard); ///week13-1新加的

        glutMouseFunc(mouse); ///滑鼠點下去, 滑鼠拖曳, 滑鼠拿起來

    }

```

  



## week13-2_FILE_fopen_fprintf_fscanf

1. 把 week13-1_glm_gundam_keyboard_angleID_mouse_motion_angle 複製整個目錄, 

    檔名改成 week13-2_FILE_fopen_fprintf_fscanf

2. 更改 .cbp 檔的檔名為 week13-2_FILE_fopen_fprintf_fscanf

3. 再用 Notepad++ 開啟 .cbp檔, 改Title為 week13-2_FILE_fopen_fprintf_fscanf

4. 開啟 week13-2_FILE_fopen_fprintf_fscanf

5. 要加 FILE 指標, 下面橘色部分

```cpp

    #include <stdio.h>

    FILE * fin = NULL;

    FILE * fout = NULL;

    void motion(int x, int y){

         if(fout==NULL) fout = fopen("angle.txt", "w+");

        for(int i=0;i<29;i++){

            printf("%.1f ", angle[i]);

            fprint(fout, "%.1f ", angle[i]);

        }

        printf("\n");

        fprintf(fout, "\n");

    }

```

6. 你執行程式時, 用 mouse motion 一邊改變角度, 一邊大量產生角度值,

    小黑關掉後, 可在目錄哩, 看到 angle,txt 裡面就是剛剛印的一堆數值




7. 小心, angle.txt 裡面要有空格, 不然就錯了。printf() 和 fprintf() 要加 "%.1f "

8. 接著再加上下面橘色部分

```cpp

    void keyboard (unsigned char key, int x, int y){

        if(key=='r'){

            if(fin==NULL) fin = fopen("angle.txt", "r");

            for(int i=0;i<20;i++){

                fscanf(fin, "%f", & angle[i]);

            }

            glutPostRedisplay();

        }

        if(key=='0') angleID = 0;

        if(key=='1') angleID = 1;

        if(key=='2') angleID = 2;

        if(key=='3') angleID = 3;

    }

```

9. 當按下鍵盤上的 "r" 不放開, 會自動讀取上一次移動的路徑

10. 把 void drawmodel(void){} 全部的 "pmodel" 改成 "body"

11. 把 void display(){} 裡的 

      a. "myBody()" 改成 "drawBody()"

      b. glutSolidSphere(0.1, 30, 30); 註解掉

      c. 把原本的 glPushMatrix(); 函式全部 TAB 然後最外層再加上一個 glPushMatrix(); 函式

      d. 更改 glRotatef 函式裡面的 angle[] 和 座標

      e. 最後就會可以分四個關節移動




沒有留言:

張貼留言