使用Timer函式控制各種動畫
(一)顏色about color(1)
(二)轉動about rotation(2)~(3)
(1)白色圈圈經過一段時間可以自動變更背景顏色
(1-1)~(1-2)實體變色
(1-3)~(1-4)線體變色
(2)白色正方形經過一段時間可以自動開始旋轉
(2-3)轉動後反轉
(3)轉動手臂
(1)白色圈圈程式碼:
![]() |
| (1-1未變色) |
![]() |
| (1-2變色) |
![]() |
| (1-3線性的白圈) |
![]() |
| (1-4線條版的黃色背景) |
(2)轉動程式碼(超過180反轉):
#include <GL/glut.h>
int angle=0;
void display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glutSolidCube(0.3);///一個正方形
#include <GL/glut.h>
int angle=0;
void display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glutSolidCube(0.3);
glPopMatrix();
glutSwapBuffers();
}
int diff=1;///加一個判斷用的整數
void timer(int t){
glutTimerFunc(20,timer,t+1);///(速度,使用的函式,參數)
angle+=diff;///(角度旋轉)
if(angle>180)diff=-diff;///超過180度,開始反轉
if(angle<0)diff=-diff;
display();
}
int main(int argc,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000,timer,0);///(定時,函式,參數)
glutMainLoop();
}
![]() |
| (2-1未轉動) |
![]() |
| (2-1開始轉) |
(3)轉動手臂程式碼(超過90反轉):
#include <GL/glut.h>
int angle=0;
void drawArml(){
glPushMatrix();
glScalef(1,0.5,0.5);
glColor3f(1,0,0);glutSolidCube(0.3);///紅色的手
glPopMatrix();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glColor3f(1,1,1);glutSolidCube(0.4);///白身體
glPushMatrix();
glTranslatef(-0.2,+0.2,0);///掛到右上角
glRotatef(angle,0,0,1);///轉動
glTranslatef(-0.15,0,0);///把旋轉中心的關節軸,放在正中心
drawArml();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int diff=2;
void timer(int t){
glutTimerFunc(20,timer,t+1);
angle+=diff;
if(angle>90 || angle<0)diff=-diff;///判斷角度旋轉
display();
}
int main(int argc, char** argv){
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(0,timer,0);
glutMainLoop();
}
![]() |
| (3-1轉動一) |
![]() |
| (3-2轉動二) |









沒有留言:
張貼留言