# 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. 最後就會可以分四個關節移動



沒有留言:
張貼留言