2021年5月31日 星期一

你要出多少_week13

 

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

#include <opencv/cv.h>

#include <GL/glut.h>

#include "glm.h"   ///使用外掛


GLMmodel*pmodel1=NULL;   ///glm模型指標


void drawmodel(void)    ///函式讀取鋼彈

{

    if(!pmodel1)

    {

        pmodel1=glmReadOBJ("Gundam.obj");

        if(!pmodel1)exit(0);

        glmUnitize(pmodel1);

        glmFacetNormals(pmodel1);

        glmVertexNormals(pmodel1, 90.0);

    }

    glmDraw(pmodel1,GLM_SMOOTH | GLM_TEXTURE);   ///參數

}


GLuint id1, id2; ///TODO:增加2個 貼圖ID

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖

    cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)

    glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能

    GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID

    glGenTextures(1, &id); /// 產生Generate 貼圖ID

    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);

    return id;

}


float angle=0;///初始角度=0


void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glBindTexture(GL_TEXTURE_2D, id1);

    glPushMatrix();///畫鋼彈

        glRotatef(angle,0,1,0);///軸心旋轉

        drawmodel();

    glPopMatrix();


    glBindTexture(GL_TEXTURE_2D, id2);

    glBegin(GL_POLYGON);

        glTexCoord2f( 0, 0 ); glVertex3f( -1, +1 ,0.8);

        glTexCoord2f( 0, 1 ); glVertex3f( -1, -1 ,0.8);

        glTexCoord2f( 1, 1 ); glVertex3f( +1, -1 ,0.8);

        glTexCoord2f( 1, 0 ); glVertex3f( +1, +1 ,0.8);

    glEnd();

    glutSwapBuffers();

    angle+=0.3;///(如果覺得太快改這邊)

}

int main(int argc, char** argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("week13");

    glutDisplayFunc(display);

    glutIdleFunc(display);


    id1 = myTexture("Diffuse.jpg");///鋼彈貼圖

    id2 = myTexture("heyyy.jpg");///背景

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();

}




week15-我的檔案跑不出來0.0

1.建立新的glut專案 

2.輸入程式碼

#include <stdio.h>


int main(int argc,char** argv)

{

    FILE * fout = NULL;

    fout = fopen("檔名.txt","w+");


    printf("Hello World\n");

    fprintf(fout,"Hello Wolrd\n");

}

    然後我的程式跑不出來QQ


1.接著用notepad++編輯自己的cbp檔,把working_dir後面""裡面的名稱改為.,接著存檔回到專案檔重建,檔名.txt檔案位置就會更換,這樣就是成功了
2.接著我們來改程式碼,首先我們要把舊程式全部註解掉
3.下面是程式碼

#include <stdio.h>  /// step01外掛 printf(),fprintf(),fscanf(),fopen()

int main(int argc,char** argv)

{

    //FILE * fout=NULL;

    //fout = fopen("檔名.txt","w+");


   // printf("Hello World\n");

   // fprintf(fout,"Hello World\n");  (註解掉的程式碼)


   FILE * fin = NULL;

   fin = fopen("檔名.txt","r");


   ///scanf( "%d",&n );//int n

   ///scanf( "%c",&c );//char c

   ///scanf( "%f",&f );//float f

   ///scanf( "%s",line );//char line[100];

   ///以上是複習的程式碼


   char line[100];

   fscanf(fin,"%s",line);

   printf("現在讀到的是 %s \n",line);


   fscanf(fin,"%s",line);

   printf("現在讀到的是 %s \n",line);

}

1.首先將程式碼備份,然後全部刪除,再來打新的程式碼


#include <stdio.h>

#include <GL/glut.h>

void display()

{



    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    glutSolidTeapot(0.3);

    glutSwapBuffers();

}

int main(int argc, char **argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);//顯示模式

    glutCreateWindow("week_15");


    glutDisplayFunc(display);

    glutMainLoop();


}


缺錢week15

 存檔讀檔


1.小黑框跳出hello world
2.fprintf=在指定位置做出txt檔
1.改codeblock的東西(cbp檔),用notepad,把路徑改成一點(.
)檔案名稱最好用英文才不會在改好notepad後出現亂碼,回到codeblock後按yes讓程式重新跑




讀到檔案內的文字並印出來









把第三步的程式碼複製好後把專案的程式碼清空換成以上程式碼,並記得放freeglut.dll檔在專案資料夾裡




複習上週程式碼(timer)




最後將兩手臂加上TRT


Week_15 2021.05.31

1. 存檔

    1. 輸入程式碼

github   
---------------------------------------------------------------------------------------------------  

        (1) 會出現

            注意!!! 

                反白的是原本檔案的位置

        (2) 去到這個資料夾看看 成功了!

    2. 改資料夾位置

        (1) 用 Notpad++ 改

        (2) 改成 .

        (3) Code Blocks 會跳出通知 選 YES

        (4) 最後執行  成功!

2. 讀檔

    1. 註解上面程式碼
    2. 輸入新的程式碼

                github   
        ---------------------------------------------------------------------------------------------------  

    3. 會出現

3. 做一個茶壺

    1. 輸入新的程式碼 (舊的註解掉)

                github   
        ---------------------------------------------------------------------------------------------------  

    2. 結果出錯?

    3. 少什麼就複製什麼(freeglut.dll)
    4. 成功!

4.多很多關節

    1. 輸入程式碼

            注意!!
                angle 角度要改成負的
                github   
        ---------------------------------------------------------------------------------------------------  

    2. 會出現

        










JOJO的電腦圖學_week15

 210531 week15

                                                                                                                                  🔔❤️

Robot 2.0

FILE

首先開啟一個新的GLUT檔案>將main.cpp原本的程式碼刪掉

printf在小黑印出>紅色框框

fprintf在執行目錄印出>橘色箭頭

跑到了freeglut的bin資料夾底下

#include <stdio.h>

int main(int argc, char** argv)

{

    FILE             *         fout=NULL;///檔案指標

    ///檔案資料結構  //指標

fout=fopen("檔名.txt","w+");


printf("Hello World\n");///在小黑印出

fprintf(fout, "Hello World\n");///在執行目錄印出

}


幫助它回到正確執行目錄
working_dir改小數點

可以參考我的💁第十二週
https://2021graphics.blogspot.com/2021/05/jojoweek12.html

選擇Yes!
執行目錄變了
就會跑到week15_file資料夾底下









新的開始1

把原本的程式碼註解

       Edit>Comment

跑出"現在讀到的是 Hello"
再複製一次紅框部分
會跑出"現在讀到的是 World"







#include <stdio.h>

int main(int argc, char** argv)

{

// FILE *fout=NULL;///檔案指標

//    ///檔案資料結構  //指標

// fout=fopen("檔名.txt","w+");

//

// printf("Hello World\n");///在小黑印出

// fprintf(fout, "Hello World\n");///在執行目錄印出

    FILE * fin = NULL;

    fin = fopen("檔名.txt","r");

    char line[100];///宣告一個字串line

    fscanf(fin,"%s",line);///讀入字串

    printf("現在讀到的是 %s \n", line);///印出字串


     fscanf(fin,"%s",line);///讀入字串

    printf("現在讀到的是 %s \n", line);///印出字串

}


新的開始2

將之前的程式碼刪掉,放上茶壺的程式碼

程式碼可以參考我的💁第四週
https://2021graphics.blogspot.com/2021/03/jojoweek04.html
畫茶壺的100種方法

它說找不到freeglut.dll(因為剛剛修改過執行目錄)

那複製一個freeglut.dll到week15資料夾如何啊!

完成一個茶壺



 





#include <stdio.h>

#include <GL/glut.h>

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///清空

    glutSolidTeapot(0.3);///實心茶壺(改變大小)

    glutSwapBuffers();///交換兩倍的Buffers

}

int main(int argc, char**argv)///???以前是int main()

{

    glutInit(&argc,argv);///(1)GLUT初始設定

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///(2)顯示模式

    glutCreateWindow("我是week15的JOJO");

    glutDisplayFunc(display);///(4)等一下要顯示的函式(display顯示函式)

    glutMainLoop();///(5)主要迴圈

}

複習上週的Timer

改完還看不出變化😂



(更改部分為豆沙粉色

#include <stdio.h>

#include <GL/glut.h>
float angle=0,diff=2;
void timer(int t)
{
    glutTimerFunc(30,timer,t+1);
    angle+=diff;
    if(angle>90) diff = -2;
    if(angle<0) diff = +2;
    glutPostRedisplay();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///清空
    glutSolidTeapot(0.3);///身體
    glutSolidTeapot(0.3);///左手臂
    glutSolidTeapot(0.3);///左手肘
    glutSolidTeapot(0.3);///右手臂
    glutSolidTeapot(0.3);///右手肘
    glutSwapBuffers();///交換兩倍的Buffers
}
int main(int argc, char**argv)///???以前是int main()
{
    glutInit(&argc,argv);///(1)GLUT初始設定
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///(2)顯示模式
    glutCreateWindow("我是week15的JOJO");

    glutDisplayFunc(display);///(4)等一下要顯示的函式(display顯示函式)
    glutTimerFunc(0,timer,0);
    glutMainLoop();///(5)主要迴圈
}

這是一個在單手健身的茶壺(紅色框框是左手程式碼)
這是在雙手健身的茶壺(紅色框框是右手程式碼)

以下是display裡面的程式碼

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );///清空
    glPushMatrix();
        glutSolidTeapot(0.3);///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.3,0,0);
                glutSolidTeapot(0.3);///左手臂
                glPushMatrix();
                    glTranslatef(-0.3,0,0);
                    glRotatef(angle,0,0,1);
                    glTranslatef(-0.3,0,0);
                    glutSolidTeapot(0.3);///左手肘
                glPopMatrix();
        glPopMatrix();
        glPushMatrix();
             glTranslatef(+0.3,0,0);
                    glRotatef(-angle, 0,0,1);
                    glTranslatef(+0.3,0,0);
                    glutSolidTeapot( 0.3 );///右手臂
                    glPushMatrix();
                        glTranslatef(+0.3,0,0);
                        glRotatef(-angle, 0,0,1);
                        glTranslatef(+0.3,0,0);
                        glutSolidTeapot( 0.3 );///右手肘
                    glPopMatrix();
                glPopMatrix();
        glPopMatrix();
        glutSwapBuffers();///交換兩倍的Buffers
    }


如果喜歡我的部落格的話
請幫我按右上角的愛心(根本按不下去)

也可以按右上角的小鈴鐺(這也按不下去)
才不會錯過我的更新哦!😉

MCUCG_Week15

 1.創建文件檔


#include <stdio.h>

int main(int argc, char** argv)

{

    FILE * fout = NULL;

    fout = fopen("檔名.txt", "w+");


    printf("Hello World\n");

    fprintf(fout, "Hello World\n");

}

2.讀取文件文字

#include <stdio.h>
int main(int argc, char** argv)
{
    FILE * fin = NULL;
    fin = fopen("檔名.txt", "r");

    char line[100];
    fscanf(fin , "%s", line);
    printf("現在讀到的是 %s \n", line);

    fscanf(fin , "%s", line);
    printf("現在讀到的是 %s \n", line);
}
3.茶壺
#include <stdio.h>
#include <GL/glut.h>
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();

}
int main(int argc , char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");

    glutDisplayFunc( display);
    glutMainLoop();
}
4.茶壺手臂模擬(上下移動)
#include <stdio.h>
#include <GL/glut.h>
float angle = 0, diff = 2;
void timer(int t)
{
    glutTimerFunc( 30, timer, t+1);
    angle += diff;
    if(angle > 90) diff = -2;
    if(angle < 0) diff = +2;
    glutPostRedisplay();
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );
        glPushMatrix();
            glTranslatef(-0.5,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.5,0,0);
            glutSolidTeapot(0.3);
            glPushMatrix();
                glTranslatef(-0.5,0,0);
                glRotatef(angle,0,0,1);
                glTranslatef(-0.5,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glutSolidTeapot(0.3);
            glutSolidTeapot(0.3);
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();

}
int main(int argc , char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");

    glutDisplayFunc( display);
    glutTimerFunc(0,timer,0);
    glutMainLoop();
}
5.茶壺模擬雙臂移動(上下移動)

#include <stdio.h>
#include <GL/glut.h>
float angle = 0, diff = 2;
void timer(int t)
{
    glutTimerFunc( 30, timer, t+1);
    angle += diff;
    if(angle > 90) diff = -2;
    if(angle < 0) diff = +2;
    glutPostRedisplay();
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot(0.3);
            glPushMatrix();
                glTranslatef(-0.3,0,0);
                glRotatef(angle,0,0,1);
                glTranslatef(-0.3,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.3,0,0);
            glRotatef(-angle,0,0,1);
            glTranslatef(0.3,0,0);
            glutSolidTeapot(0.3);
            glPushMatrix();
                glTranslatef(0.3,0,0);
                glRotatef(-angle,0,0,1);
                glTranslatef(0.3,0,0);
                glutSolidTeapot(0.3);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();

}
int main(int argc , char**argv)
{
    glutInit( &argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15");

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








week15

 1.存檔 讀檔

程式碼:

///主題: 存檔、讀檔

#include <stdio.h> ///step01 外掛 printf(), fprintf(), fscanf(), fopen()


int main( int argc, char** argv )

{

    FILE * fout=NULL;///step01 檔案指標 file output 變數

    fout = fopen("檔名.txt", "w+");///step01 開啟檔案,檔名.txt, 模式write


    printf("Hello World\n");

    fprintf(fout, "Hello World\n");///step01 改裝 printf() 變 fprintf()

}



程式碼:
#include<stdio.h>//外掛printf() fprintf() fscanf() fopen()
int main(int argc,char**argv)
{
    FILE * fin=NULL;//改成讀檔
    fin=fopen("a.txt","r");//開啟剛剛做的檔案 模式read
    char line[100];//宣告字串
    fscanf(fin,"%s",line);//讀入字串
    printf("現在讀到的是 %s\n",line);//印出字串
    fscanf(fin,"%s",line);
    printf("現在讀到的是 %s\n",line);

 *記得將freeglut的dull檔案從freeglut的bin目錄複製到專案目錄裡

程式碼:

        #include <stdio.h>

#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week15 many angles");

    glutDisplayFunc(display);
    glutMainLoop();
}///先不放貼圖, 先不放打光


 

 程式碼:

#include <stdio.h>
#include <GL/glut.h>
float angle=0, diff=2; ///上週程式,會增加、會減少!!!
///float angle[20]={};///都是0的陣列 angle
void timer(int t)///上週程式,會增加
{
    glutTimerFunc(30, timer, t+1);///上週程式 設定新的timer
    angle += diff; ///上週程式,會增加、會減少!!!
    if(angle>90) diff = -2;///上週程式,會增加、會減少!!!
    if(angle<0) diff = +2;///上週程式,會增加、會減少!!!
    glutPostRedisplay();///上週教display();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
        glutSolidTeapot(0.3);
        glutSolidTeapot(0.3);
        glutSolidTeapot(0.3);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char** argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow("week15 many angles");

    glutDisplayFunc(display);
    glutTimerFunc( 0, timer, 0);
    glutMainLoop();
}///先不放貼圖, 先不放打光


  程式碼:

#include <stdio.h>

#include <GL/glut.h>

float angle=0, diff=2;///上週程式,會增加、會減少!!!

///float angle[20]={};//都是0的陣列 angle

void timer(int t)///上週程式,會增加、會減少!!!

{

    glutTimerFunc( 30, timer, t+1 );///上週程式 設定新的timer

    angle += diff;///上週程式,會增加、會減少!!!

    if(angle>90) diff = -2;///上週程式,會增加、會減少!!!

    if(angle<0) diff = +2;///上週程式,會增加、會減少!!!

    glutPostRedisplay();///上週教display();

}

void display()

{

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glPushMatrix();///Step05-2

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///Step05-2

            glTranslatef(-0.3,0,0);

            glRotatef(angle, 0,0,1);

            glTranslatef(-0.3,0,0);

            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置

            glPushMatrix();

                glTranslatef(-0.3, 0,0);

                glRotatef(angle, 0,0,1);

                glTranslatef(-0.3, 0,0);

                glutSolidTeapot( 0.3 );///左手肘

            glPopMatrix();

        glPopMatrix();///Step05-2

        glPushMatrix();///Step05-2

            glutSolidTeapot( 0.3 );///右手臂

            glutSolidTeapot( 0.3 );///右手肘

        glPopMatrix();///Step05-2

    glPopMatrix();///Step05-2

    glutSwapBuffers();

}

int main( int argc, char** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow( "week15 many angles" );


    glutDisplayFunc( display );

    glutTimerFunc( 0, timer, 0);

    glutMainLoop();

}///先不放貼圖, 先不放打光






你要出多少_week15

檔案輸出

先建立專案檔

下面是程式碼


///主題: 存檔、讀檔

#include <stdio.h>  /// step01外掛 printf(),fprintf(),fscanf(),fopen()

int main(int argc,char** argv)

{

    FILE * fout=NULL;

    fout = fopen("檔名.txt","w+");


    printf("Hello World\n");

    fprintf(fout,"Hello World\n");

}

紅色程式碼印出的Hello World在黑色小視窗中


///主題: 存檔、讀檔

#include <stdio.h>  /// step01外掛 printf(),fprintf(),fscanf(),fopen()

int main(int argc,char** argv)

{

    FILE * fout=NULL;

    fout = fopen("檔名.txt","w+");


    printf("Hello World\n");

    fprintf(fout,"Hello World\n");

}

而這個紅色程式碼的Hello World要去C槽找freeglut再選bin會看到檔名.txt,打開後就會看到Hello World


接著去用notepad++編輯自己的cbp檔,把working_dir後面""裡面的名稱改為.,接著存檔回到專案檔重建,檔名.txt檔案位子就會更換,這樣就是成功了

如圖下


接著我們來改程式碼,首先我們要把舊程式全部註解掉
再來照著下面的程式碼打

///主題: 存檔、讀檔

#include <stdio.h>  /// step01外掛 printf(),fprintf(),fscanf(),fopen()

int main(int argc,char** argv)

{

    //FILE * fout=NULL;

    //fout = fopen("檔名.txt","w+");


   // printf("Hello World\n");

   // fprintf(fout,"Hello World\n");  (註解掉的程式碼)


   FILE * fin = NULL;

   fin = fopen("檔名.txt","r");


   ///scanf( "%d",&n );//int n

   ///scanf( "%c",&c );//char c

   ///scanf( "%f",&f );//float f

   ///scanf( "%s",line );//char line[100];

   ///以上是複習的程式碼


   char line[100];

   fscanf(fin,"%s",line);

   printf("現在讀到的是 %s \n",line);


   fscanf(fin,"%s",line);

   printf("現在讀到的是 %s \n",line);

}

下面是執行結果


首先我們將程式碼備份,然後全部刪除,來打新的程式碼,以下是程式碼

#include <stdio.h>

#include <GL/glut.h>

void display()

{



    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    glutSolidTeapot(0.3);

    glutSwapBuffers();

}

int main(int argc, char **argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);//顯示模式

    glutCreateWindow("week_15");


    glutDisplayFunc(display);

    glutMainLoop();


}

如果執行過程無法運行,就去把freeglut裡的bin的freeglut.dll複製貼到專案檔中的資料夾,再去執行就可以了


#include <stdio.h>
#include <GL/glut.h>
float angle=0,diff=2;
void timer(int t)
{

    glutTimerFunc(30,timer,t+1);
    angle += diff;
    if(angle>90) diff= -2;
    if(angle<0) diff= +2;
    glutPostRedisplay();

}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);///身體
        glutSolidTeapot(0.3);///左手臂
        glutSolidTeapot(0.3);///左手肘
        glutSolidTeapot(0.3);///右手臂
        glutSolidTeapot(0.3);///右手肘
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week_15");


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


}

到這邊五個茶壺會固定不動,所以我們只會看到一個茶壺,因為他們疊在一起了


接著我們來做會動的手臂

#include <stdio.h>
#include <GL/glut.h>
float angle=0,diff=2;
void timer(int t)
{

    glutTimerFunc(30,timer,t+1);
    angle += diff;
    if(angle>90) diff= -2;
    if(angle<0) diff= +2;
    glutPostRedisplay();

}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///Step05-2
            glTranslatef(-0.3,0,0);
            glRotatef(angle, 0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle, 0,0,1);
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();///Step05-2
        glPushMatrix();///Step05-2
            glutSolidTeapot( 0.3 );///右手臂
            glutSolidTeapot( 0.3 );///右手肘
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week_15");


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


}

下圖是執行結果


做出了左手臂,我們來做一下右手臂吧。
#include <stdio.h>
#include <GL/glut.h>
float angle=0,diff=2;
void timer(int t)
{

    glutTimerFunc(30,timer,t+1);
    angle += diff;
    if(angle>90) diff= -2;
    if(angle<0) diff= +2;
    glutPostRedisplay();

}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glPushMatrix();///Step05-2
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);
            glRotatef(angle, 0,0,1);
            glTranslatef(-0.3,0,0);
            glutSolidTeapot( 0.3 );///左手臂, 但是,要用 T-R-T移位置
            glPushMatrix();
                glTranslatef(-0.3, 0,0);
                glRotatef(angle, 0,0,1);
                glTranslatef(-0.3, 0,0);
                glutSolidTeapot( 0.3 );///左手肘
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glTranslatef(+0.3,0,0);
            glRotatef(-angle, 0,0,1);
            glTranslatef(+0.3,0,0);
            glutSolidTeapot( 0.3 );///右手臂
            glPushMatrix();///step05-3
                glTranslatef(+0.3,0,0);
                glRotatef(-angle, 0,0,1);
                glTranslatef(+0.3,0,0);
                glutSolidTeapot( 0.3 );///右手肘
            glPopMatrix();///Step05-3
        glPopMatrix();///Step05-2
    glPopMatrix();///Step05-2
    glutSwapBuffers();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week_15");


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


}

執行結果如下






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

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