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);
}
```
.png)
```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();
}
```
.png)
.png)
沒有留言:
張貼留言