2021年5月24日 星期一

阿米君の電腦圖學小筆記_Week14

☆本週內容☆
畫出圓形

程式碼:
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere( 0.3    ,   30   ,     30);    ///畫實心圓球
                              (半徑  , 縱切 ,  橫切)
    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 08160023");

    glutDisplayFunc(display);
    glutMainLoop();
}


講解切割參數
"glutWireSphere(0.3,10,20);"  畫出線條了解切割方向



啟動Timer計時器
啟動程式的瞬間就開始計時,設定1000=>1秒,1秒過後背景亮紅色

程式碼:
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.3,30,30);
    glutSwapBuffers();
}

void timer(int t)   ///時間函式
{
    glClearColor(1,0,0,0);  ///清除背景顏色 :紅色
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 08160023");

    glutDisplayFunc(display);
    glutTimerFunc(   1000    ,  timer    ,  0);   ///呼叫時間函式
                        ///等待時間 , 呼叫誰 , 參數
    glutMainLoop();


計時器變化1
到時間後開始旋轉,以設定鬧鐘當例子

程式碼:
#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();
}

void timer(int t) ///step1:鬧鐘響起
{
    glutTimerFunc(30 ,timer ,t+1);  ///step2:馬上設定下一個鬧鐘
    angle++;   ///step3:起床
    display();
}   ///又睡著

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 08160023");

    glutDisplayFunc(display);
    glutTimerFunc(0    , timer , 0); ///睡前第一個鬧鐘
    glutMainLoop();
}

計時器變化2

設變數判斷旋轉

程式碼:
#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=2;   ///宣告一個變數當"改變值"
void timer(int t) ///時間函式
{
    glutTimerFunc(20 ,timer ,t+1);
    angle+=diff;    ///改變值變化反應在旋轉角度上
   
    if(angle>180///如果角度>180,轉回去
    {
        diff=-diff;
    }
    if(angle<0///如果角度<0,再轉回去
    {
        diff=-diff;
    }
    display();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 08160023");

    glutDisplayFunc(display);
    glutTimerFunc(4000    , timer , 0);
    glutMainLoop();
}



畫出簡單動畫圖

step1:先畫出圖,註解取名左手(紅)和身體(白):

step2:把旋轉軸放在中央


step3:加入轉動以及調整手臂要放的位置,成功讓左手舉起/放下
程式碼:
#include <GL/glut.h>
int angle=0;
void drawArm()   ///畫手臂函式
{
    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);   ///軸心
            drawArm();
        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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week14 08160023");

    glutDisplayFunc(display);
    glutTimerFunc(0, timer , 0); ///馬上開始,不等待
    glutMainLoop();
}
























沒有留言:

張貼留言

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

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