2024年5月20日 星期一

電腦圖學坐牢中 week14

0. 老規矩

0-1. 安裝freeglut

0-2. 安裝OpenCV2.1

0-3. 重新CodeBlocks, 設定opencv的3個設定


1. week14-1_angle_motion_save

1-1. 將上週的 week13-3 複製,並改檔名為 week14-1_angle_motion_save

1-2. 修改程式

```cpp

float angleX[10]={}; ///float angle = 0, da = -1

float angleY[10]={}; ///mouse motion時,可同時1個關節的

void display()

{

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

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

}

```

2. week14-2_alpha_blending

2-1. 複製 week14-1 變成 week14-2_alpha_blending

2-2. 改檔案名稱及 .cbp 的名字為 week14-2_alpha_blending

2-3. 更改表格資料

*A :時間、B:alpha0~1、C:舊的座標、D:新的座標、E:內插植

alpha公式 = 時間 / 20 (ex: A2 / 20)

內插結果公式 = 新座標 * α + 舊座標*(1 - α)  (ex: B2 * D2 + C2 / (1 - B2))

2-4. 修改程式

```cpp

void timer(int t)

{

    printf("你呼叫了 timer(%d)\n", t);

}

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

{

    printf("程式開始執行\n");

    glutMouseFunc(mouse);

    glutTimerFunc(1000, timer, 1);

    glutTimerFunc(2000, timer, 2);

    glutTimerFunc(3000, timer, 3);

}

void timer(int t)

{

    glutTimerFunc(1000, timer, t + 1);

}

```


```cpp

void timer(int t);

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

    if(key == 'p'){

        glutTimerFunc(0, timer, 0);

    }

}

```


自動顯示時間,不用一個個去調整

2-5. 讓機器人自己動起來

```cpp

float oldAngleX[10] = {};

float oldAngleY[10] = {};

float newAngleX[10] = {};

float newAngleY[10] = {};

void timer(int t)

{

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

    if(t%20 == 0){

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

            oldAngleX[i] = newAngleX[i];

            oldAngleY[i] = newAngleY[i];

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

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

        }

    }

    float alpha = (t%20 / 20.0);

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

        angleX[i] = alpha * newAngleX[i] + (1 - alpha) * oldAngleX[i];

        angleY[i] = alpha * newAngleY[i] + (1 - alpha) * oldAngleY[i];

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

    }

    glutPostRedisplay();

}

```

沒有留言:

張貼留言