Week14 閻覃的上課筆記
計時器
設定鬧鐘函式
1//Declared In: glut.h 23extern void glutTimerFunc(unsigned int millis, void (*)(int) func, int value)第一個參數是下一次呼叫func的延遲時間,單位是毫秒。
第二個參數是要呼叫的函數指針。
第三個參數是傳遞的參數。
1float time = 0;23void timer(int t){4 glutTimerFunc(10, timer, t+1);5 time += 0.01;6 glutPostRedisplay();7}8//其實t沒有用TRT進階
每一個身體部分都會有一個TRT函式。主要做的工作就是
- 移動到旋轉中心
- 旋轉
- 移動到目標點
經過抽象,形成一個函式。
typedef float Coordinate[3]; void TRT(float angle, const Coordinate& rotateAxis, const Coordinate& rotateCentre, const Coordinate& aimCentre);
angle是旋轉的角度
rotateAxis是旋轉軸
rotateCentre是旋轉中心
aimCentre是目標點
函式的具體實現:
x
91void 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都用這個函式直接替換:
491void Robot::drawArms() {2 static float armAngle = 0;3 static float flag = 1;45 if (armAngle > 60)6 flag = -1;7 if (armAngle < 0)8 flag = 1;9 armAngle += flag * 2;101112 glPushMatrix();13 {14 TRT(armAngle,15 {0, 0, 1},16 {-0.05, 0.01, 0},17 {-0.13, 0.06, -0.01});1819 glmDraw(armRUpper, GLM_SMOOTH | GLM_MATERIAL);2021 TRT(armAngle,22 {0, 1, 0},23 {-0.08, 0, 0},24 {-0.14, 0, 0.01});25 glmDraw(armRLower, GLM_SMOOTH | GLM_MATERIAL);2627 }28 glPopMatrix();2930 glPushMatrix();31 {32 TRT(-armAngle,33 {0, 0, 1},34 {0.05, 0.01, 0},35 {0.13, 0.06, -0.01});3637 glmDraw(armLUpper, GLM_SMOOTH | GLM_MATERIAL);3839 TRT(-armAngle,40 {0, 1, 0},41 {0.08, 0, 0},42 {0.14, 0, 0.01});43 glmDraw(armLLower, GLM_SMOOTH | GLM_MATERIAL);4445 }46 glPopMatrix();4748}49
沒有留言:
張貼留言