2021年5月24日 星期一

橘貓(電圖小筆記_week14)

 使用Timer函式控制各種動畫

(一)顏色about color(1)

(二)轉動about rotation(2)~(3)

(1)白色圈圈經過一段時間可以自動變更背景顏色

(1-1)~(1-2)實體變色

(1-3)~(1-4)線體變色

(2)白色正方形經過一段時間可以自動開始旋轉

(2-1)~(2-1)從靜止到轉動

(2-3)轉動後反轉

(3)轉動手臂

(3-1)~(3-2)手臂轉動

(1)白色圈圈程式碼:

 #include <GL/glut.h>
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.3,30,30);///畫一個實心圓(半徑,縱切,橫片切)
   /*glutSolidSphere(0.3,30,30); ///Solid實體(1-1)
     glutWireSphere(0.3,30,30); ///Wire線(1-3)
   */
    glutSwapBuffers();
}
void timer(int t){
    glClearColor(1,1,0,0);///背景變黃色(1-2),(1-3)
    display();
}
int main(int argc, char** argv){
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week14");
    glutDisplayFunc(display);
    glutTimerFunc(4000,timer,0);///時間,使用的函式,參數
    glutMainLoop();
}
(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開始轉)

(2-3反轉)

(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轉動二)


沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...