2017年5月22日 星期一

Week14 閻覃的上課筆記

Week14 閻覃的上課筆記.md

Week14 閻覃的上課筆記

計時器

設定鬧鐘函式

 
1
//Declared In: glut.h  
2
3
extern void glutTimerFunc(unsigned int millis, void (*)(int) func, int value)

第一個參數是下一次呼叫func的延遲時間,單位是毫秒。

第二個參數是要呼叫的函數指針。

第三個參數是傳遞的參數。

 
1
float time = 0;
2
3
void timer(int t){
4
    glutTimerFunc(10, timer, t+1);
5
    time += 0.01;
6
    glutPostRedisplay();
7
}
8
//其實t沒有用

TRT進階

每一個身體部分都會有一個TRT函式。主要做的工作就是

  1. 移動到旋轉中心
  2. 旋轉
  3. 移動到目標點

經過抽象,形成一個函式。

typedef float Coordinate[3];
void TRT(float angle, const Coordinate& rotateAxis, const Coordinate& rotateCentre, const Coordinate& aimCentre);

angle是旋轉的角度

rotateAxis是旋轉軸

rotateCentre是旋轉中心

aimCentre是目標點

函式的具體實現:

 
x
9
1
void Robot::TRT(float angle, const Coordinate &rotateAxis, const Coordinate &rotateCentre, const Coordinate &aimCentre) {
2
    glTranslatef(aimCentre[0] - rotateCentre[0], aimCentre[1] - rotateCentre[1], aimCentre[2] - rotateCentre[2]);
3
    glRotatef(angle, rotateAxis[0], rotateAxis[1], rotateAxis[2]);
4
    glTranslatef(rotateCentre[0], rotateCentre[1], rotateCentre[2]);
5
}
6

之後所有的TRT都用這個函式直接替換:

 
49
1
void Robot::drawArms() {
2
    static float armAngle = 0;
3
    static float flag = 1;
4
5
    if (armAngle > 60)
6
        flag = -1;
7
    if (armAngle < 0)
8
        flag = 1;
9
    armAngle += flag * 2;
10
11
12
    glPushMatrix();
13
    {
14
        TRT(armAngle,
15
            {0, 0, 1},
16
            {-0.05, 0.01, 0},
17
            {-0.13, 0.06, -0.01});
18
19
        glmDraw(armRUpper, GLM_SMOOTH | GLM_MATERIAL);
20
21
        TRT(armAngle,
22
            {0, 1, 0},
23
            {-0.08, 0, 0},
24
            {-0.14, 0, 0.01});
25
        glmDraw(armRLower, GLM_SMOOTH | GLM_MATERIAL);
26
27
    }
28
    glPopMatrix();
29
30
    glPushMatrix();
31
    {
32
        TRT(-armAngle,
33
            {0, 0, 1},
34
            {0.05, 0.01, 0},
35
            {0.13, 0.06, -0.01});
36
37
        glmDraw(armLUpper, GLM_SMOOTH | GLM_MATERIAL);
38
39
        TRT(-armAngle,
40
            {0, 1, 0},
41
            {0.08, 0, 0},
42
            {0.14, 0, 0.01});
43
        glmDraw(armLLower, GLM_SMOOTH | GLM_MATERIAL);
44
45
    }
46
    glPopMatrix();
47
48
}
49

沒有留言:

張貼留言