顯示具有 08160793 林育漍 標籤的文章。 顯示所有文章
顯示具有 08160793 林育漍 標籤的文章。 顯示所有文章

2021年6月9日 星期三

欸幹你看,是電腦圖學欸Week16

 1.把15週的程式拿來用

2.製作要讀入的檔案"angle.txt"

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

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

void timer(int t)

{

    ///glutTimerFunc(30, timer,t+1);

    ///if (fin==NULL) fin=fopen("angle.txt","r");

   ///for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

    ///glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    if (fout==NULL) fout=fopen("angle.txt","w+");

    for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    fprintf (fout,"\n");

    for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}


3.讀檔案,讓他自己動起來

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

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

void timer(int t)

{

    glutTimerFunc(30, timer,t+1);

    if (fin==NULL) fin=fopen("angle.txt","r");

    for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

    glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    if (fout==NULL) fout=fopen("angle.txt","w+");

    for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    fprintf (fout,"\n");

    for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}

4.用按鍵來讀入以及撥放

///把新專案 week16 的程式刪掉

///再把 Week15_file 的 main.cpp 拿來用

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={}, diff=2;///Step05 本來只有1個角度,現在有很多個,初始為0

int angleID=0; ///Step05 現在要改第幾個角度!!!

int oldX=0;

FILE * fout = NULL;

FILE * fin = NULL;///Step02-2 播放動畫,檔案指標fin

void timer( int t ){

//    glutTimerFunc( 30, timer, t+1 );///Step02-2 播放動畫

//    if( fin==NULL ) fin = fopen( "angle.txt", "r" );///Step02-2

//    for(int i=0; i<20; i++) fscanf( fin, "%f", & angle[i] );///Step02-2

//    glutPostRedisplay();///Step02-2 播放動畫 重畫畫面

}

void mouse(int button, int state, int x, int y){

    oldX = x;///當mouse按下去時,記下位置

}

void motion(int x, int y){///當我motion動

    angle[angleID] += x - oldX;///用x-oldX

    oldX = x;///再更新位置

    glutPostRedisplay();///現在這個比較好, 以前會用 display()重畫


//    if(fout==NULL) fout=fopen("angle.txt", "w+");

//    for(int i=0; i<20; i++) fprintf( fout, "%.1f ", angle[i]);

//    fprintf( fout, "\n");///以上2行,寫到檔案

//    for(int i=0; i<20; i++) printf( "%.1f ", angle[i]);

//    printf( "\n");///以上2行,印到畫面 (讓你知道印了什麼資料)

}

void keyboard( unsigned char key, int x, int y){ ///Step05

    if(key=='0') angleID=0; ///Step05

    if(key=='1') angleID=1; ///Step05

    if(key=='2') angleID=2; ///Step05

    if(key=='3') angleID=3; ///Step05

    if(key=='s'){///save存檔, 把所有的動作存檔後,要關掉

        if(fout==NULL) fout=fopen("angle.txt", "w+");

        for(int i=0; i<20; i++) fprintf( fout, "%.1f ", angle[i]);

        fprintf( fout, "\n");///以上2行,寫到檔案

        for(int i=0; i<20; i++) printf( "%.1f ", angle[i]);

        printf( "\n");///以上2行,印到畫面 (讓你知道印了什麼資料)

    }

    if(key=='r'){///read讀檔, 再開之後,才能讀檔

        if( fin==NULL ) fin = fopen( "angle.txt", "r" );///Step02-2

        for(int i=0; i<20; i++) fscanf( fin, "%f", & angle[i] );///Step02-2

        glutPostRedisplay();///Step02-2 播放動畫 重畫畫面

    }

    if(key=='p'){///play利用timer整個播放, 再開之後,才能讀檔


    }

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0], 0,0,1);///(2)旋轉 ///Step05

            glTranslatef(-0.3,0,0);///(1)把關節旋轉中心放到畫面中心

            glutSolidTeapot( 0.3 );///左手臂(沒有重疊)

            glPushMatrix();

                glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                glRotatef(angle[1], 0,0,1);///(2)旋轉 ///Step05

                glTranslatef(-0.3,0,0);///(1)把關節旋轉中心放到畫面中心

                glutSolidTeapot( 0.3 );///左手肘(重疊了)

            glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3, 0,0 );

            glRotatef(-angle[2], 0,0,1);

            glTranslatef(+0.3, 0,0);

            glutSolidTeapot( 0.3 );///右手臂

            glPushMatrix();

                glTranslatef(+0.3, 0,0 );

                glRotatef(-angle[3], 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 file");


    glutMouseFunc(mouse);

    glutMotionFunc(motion);

    glutKeyboardFunc(keyboard);///Step05 整合很多關節,會去改angleID

    glutTimerFunc(0, timer, 0);///Step04-2 設第1個timer做動畫

    glutDisplayFunc(display);

    glutMainLoop();

}


5.讓他可以自動撥放之前的存檔

#include <stdio.h>

#include <GL/glut.h>

float angle[20]={},diff=2;

float angleold[20]={},anglenew[20]={};///新舊角度準備內插

int angleID=0; ///現在要改第幾個角度

int oldx=0;

FILE*fout = NULL;

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

void timer(int t)

{

    glutTimerFunc(30, timer,t+1);

    if (t%10==0)

    {

        for (int i=0;i<20;i++) angleold[i]=anglenew[i];

        ///讀新資料之前,先備份

        if (fin==NULL) fin=fopen("angle.txt","r");

        for(int i=0;i<20;i++) fscanf (fin ,"%f",&anglenew[i]);

        ///讀新資料 anglenew[i]^^^^^

    }

    float alpha = (t%10)/10.0;

    for (int i=0;i<20;i++)

    {

        angle[i]=alpha*anglenew[i]+(1-alpha)*angleold[i];

    }

    glutPostRedisplay();///播放動畫,重畫畫面

}

void mouse (int button,int state,int x,int y)

{

    oldx=x;///mouse按下去時,記下位置

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;///更新位置

    glutPostRedisplay();


    ///if (fout==NULL) fout=fopen("angle.txt","w+");

    ///for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

    ///fprintf (fout,"\n");

    ///for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

    ///printf ("\n");

}

void keyboard(unsigned char key,int x,int y)

{

    if (key == '0') angleID=0;

    if (key == '1') angleID=1;

    if (key == '2') angleID=2;

    if (key == '3') angleID=3;



    if (key == 's')///存檔,把所有動作存檔後,要關掉

    {

        if (fout==NULL) fout=fopen("angle.txt","w+");

        for (int i=0;i<20;i++) fprintf (fout,"%.1f",angle[i]);

        fprintf (fout,"\n");

        for (int i=0;i<20;i++) printf ("%.1f",angle[i]);

        printf ("\n");

    }

    if (key == 'r')///讀檔,在開之後才能讀

    {

        if (fin==NULL) fin=fopen("angle.txt","r");

        for(int i=0;i<20;i++) fscanf (fin ,"%f",&angle[i]);///讀資料

        glutPostRedisplay();///播放動畫,重畫畫面

    }

    if (key == 'p')///播放

    {


    }

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        glutSolidTeapot( 0.3 );///身體

        glPushMatrix();///左半邊

            glTranslatef(-0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[0],0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[1],0,0,1);///(2)旋轉

                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

        glPushMatrix();///右半邊

            glTranslatef(+0.3,0,0);///(3)掛在正確的地方

            glRotatef(angle[2],0,0,1);///(2)旋轉

            glTranslatef(+0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方

                    glRotatef(angle[3],0,0,1);///(2)旋轉

                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心

                    glutSolidTeapot( 0.3 );///左手臂(重疊了)

                    glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    glutMotionFunc(motion);

    glutDisplayFunc(display);

    glutKeyboardFunc(keyboard);

    glutMouseFunc(mouse);

    glutTimerFunc(0,timer,0);

    glutMainLoop();

}

2021年6月2日 星期三

欸幹你看,是圖學欸Week15

 


















產生一個文字檔在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");

}









用notepad++開啟week15-file.cbp更改儲存位置。


#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");

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

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

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

    ///scanf ("%s",line);

    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>

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);///(3)掛在正確的地方

            glRotatef(angle,0,0,1);///(2)旋轉

            glTranslatef(-0.3,0,0);///(1)把關節放到正中心

            glutSolidTeapot( 0.3 );///左手臂(重疊了)

                glPushMatrix();

                    //glutSolidTeapot( 0.3 );///左手肘(重疊了)

                glPopMatrix();

        glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();

}

int main( int argc, char ** argv )

{

    glutInit( &argc, argv );

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week15 file");


    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();
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle,0,0,1);///(2)旋轉
            glTranslatef(-0.3,0,0);///(1)把關節放到正中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
                glPushMatrix();
                glTranslatef(-0.3,0,0);///(3)掛在正確的地方
                glRotatef(angle,0,0,1);///(2)旋轉
                glTranslatef(-0.3,0,0);///(1)把關節放到正中心
                glutSolidTeapot( 0.3 );///左手臂(重疊了)
                    glutSolidTeapot( 0.3 );///左手肘(重疊了)
                glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

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

















現在可以用1,0來控制茶壺
#include <stdio.h>///可割可棄
#include <GL/glut.h>
float angle[20]={},diff=2;
int angleID=0; ///現在要改第幾個角度
void timer(int t)
{
    glutTimerFunc(30, timer,t+1);
    angle[angleID]+=diff;
    if (angle[angleID]>90) diff=-2;
    if (angle[angleID]<0) diff=+2;
    glutPostRedisplay();
}
void keyboard(unsigned char key,int x,int y)
{
    if (key == '1') angleID=1;
    if (key == '0') angleID=0;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle[0],0,0,1);///(2)旋轉
            glTranslatef(-0.3,0,0);///(1)把關節放到正中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
                glPushMatrix();
                glTranslatef(-0.3,0,0);///(3)掛在正確的地方
                glRotatef(angle[0],0,0,1);///(2)旋轉
                glTranslatef(-0.3,0,0);///(1)把關節放到正中心
                glutSolidTeapot( 0.3 );///左手臂(重疊了)
                    glutSolidTeapot( 0.3 );///左手肘(重疊了)
                glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

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

















*實作*
把關節變四個,可用鍵盤控制
#include <stdio.h>///可割可棄
#include <GL/glut.h>
float angle[20]={},diff=2;
int angleID=0; ///現在要改第幾個角度
void timer(int t)
{
    glutTimerFunc(30, timer,t+1);
    angle[angleID]+=diff;
    if (angle[angleID]>90) diff=-2;
    if (angle[angleID]<0) diff=+2;
    glutPostRedisplay();
}
void keyboard(unsigned char key,int x,int y)
{
    if (key == '0') angleID=0;
    if (key == '1') angleID=1;
    if (key == '2') angleID=2;
    if (key == '3') angleID=3;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glutSolidTeapot( 0.3 );///身體
        glPushMatrix();///左半邊
            glTranslatef(-0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle[0],0,0,1);///(2)旋轉
            glTranslatef(-0.3,0,0);///(1)把關節放到正中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
                glPushMatrix();
                    glTranslatef(-0.3,0,0);///(3)掛在正確的地方
                    glRotatef(angle[1],0,0,1);///(2)旋轉
                    glTranslatef(-0.3,0,0);///(1)把關節放到正中心
                    glutSolidTeapot( 0.3 );///左手臂(重疊了)
                    glutSolidTeapot( 0.3 );///左手肘(重疊了)
                glPopMatrix();
        glPopMatrix();
        glPushMatrix();///右半邊
            glTranslatef(+0.3,0,0);///(3)掛在正確的地方
            glRotatef(angle[2],0,0,1);///(2)旋轉
            glTranslatef(+0.3,0,0);///(1)把關節放到正中心
            glutSolidTeapot( 0.3 );///左手臂(重疊了)
                glPushMatrix();
                    glTranslatef(+0.3,0,0);///(3)掛在正確的地方
                    glRotatef(angle[3],0,0,1);///(2)旋轉
                    glTranslatef(+0.3,0,0);///(1)把關節放到正中心
                    glutSolidTeapot( 0.3 );///左手臂(重疊了)
                    glutSolidTeapot( 0.3 );///左手肘(重疊了)
                glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
}
int main( int argc, char ** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week15 file");

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

2021年5月26日 星期三

欸幹你看,是圖學欸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_DOUBLE | GLUT_DEPTH );

    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);

    glutMainLoop();

}

















#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //glutSolidSphere( 0.3, 30, 30 );  ///範例偷這一行來
    ///            半徑,縱切,橫切
    glutWireSphere( 0.3, 30, 30); ///網格
    glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
    glClearColor( 1, 0, 0, 0 );///清背景色:紅色
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
    glutMainLoop();
}
進階點 , 重複持續設定Timer(鬧鐘) , 實現Angle持續旋轉角度
 void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }

           上廁所、喝水
             void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }
            
            倒頭回去睡覺
            void timer(int t)
            ///timer響起時, 做你要做的事
            {
                glutTimerFunc( 300, timer, t+1 ); 
                glClearColor( 1, 0, 0, 0 );
                angle++;
                display();
            }



#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef( angle, 0, 0, 1 );
        glutSolidCube( 0.3 );
    glPopMatrix();
    ///glutWireSphere( 0.3, 30, 30); ///網格
    glutSwapBuffers();
}
void timer(int t)
///timer響起時, 做你要做的事
{
    glutTimerFunc( 300, timer, t+1 ); 
    glClearColor( 1, 0, 0, 0 );///背景紅色
    angle++;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}

讓方塊旋轉
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
    glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
    glClearColor( 1, 0, 0, 0 );///清背景色:紅色
        if( angle>90 ) diff=diff-2;       if( angle<0  ) diff=diff+2;
       angle = angle+diff ;
    display();///重製畫面
}



加上手手選轉

#include <GL/glut.h>
///display()函式, 其實 display 是函式指標
float angle=0;
void drawArm1()
{
    glPushMatrix();
        glScalef(1, 0.5, 0.5);///變細長的手臂
        glColor3f(0, 1, 0);///綠色的
        glutSolidCube( 0.2 );///手臂
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 1, 1); glutSolidCube( 0.4 );///白色的身體
    glPushMatrix();
        glTranslatef( -0.2, 0.2, 0);///(3)掛上肩膀
        glRotatef( angle, 0, 0, 1 );///(2)轉動
        glTranslatef( -0.1, 0, 0);///(1)把旋轉中心(關節) 移到畫面最中心
        drawArm1();///綠色的手臂
    glPopMatrix();
    glutSwapBuffers();
}
int diff=2;
void timer(int t)
///timer響起時, 做你要做的事 (鬧鐘)
{
    glutTimerFunc( 20, timer, t+1 ); ///起床第一件事, 先設定新鬧鐘
    ///glClearColor( 1, 0, 0, 0 );///清背景色:紅色
    if( angle>90 ) diff=diff-2;
    if( angle<0  ) diff=diff+2;
    angle = angle+diff ;
    display();///重製畫面
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
    glutCreateWindow(" Week14 timer ");


    glutDisplayFunc(display);
    glutTimerFunc( 3000 , timer , 0 );
    ///           等多久, 函式 , int t
        glutMainLoop();
}

2021年5月12日 星期三

欸幹你看,是圖欸Week12

 











下載安裝3Dexplor

開啟當初存好的3D模型並儲存成cpp匯入進codeblocks
把錯誤的地方更正
把Rotate的部分忽略,並打上對應的程式碼



立體的茶壺#include <GL/glut.h>void display(){    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );    glutSwapBuffers();}///下面是從 GLUT專案main.cpp剪貼來的const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat high_shininess[] = { 100.0f };
int main( int argc, char** argv ){    glutInit( &argc, argv );    glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);    glutCreateWindow("week12 hw4");
    glutDisplayFunc(display);
    ///下面是從 GLUT專案main.cpp剪貼來的    glEnable(GL_DEPTH_TEST);    glDepthFunc(GL_LESS);
    glEnable(GL_LIGHT0);    glEnable(GL_NORMALIZE);    glEnable(GL_COLOR_MATERIAL);    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    glutMainLoop();}
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可#include <opencv/cv.h>#include <GL/glut.h>#include "glm.h"GLMmodel * pmodel=NULL;
GLuint id1, id2; ///TODO:增加2個 貼圖IDint 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;}voiddrawmodel(void){    if (!pmodel) { pmodel = glmReadOBJ("Gundam.obj"); if (!pmodel) exit(0); glmUnitize(pmodel); glmFacetNormals(pmodel); glmVertexNormals(pmodel, 90.0);    }
    glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);}void display(){    glClearColor(1,0,0,1);    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawmodel();
    glutSwapBuffers();}///下面是從 GLUT專案main.cpp剪貼來的const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat high_shininess[] = { 100.0f };
int main( int argc, char** argv ){    glutInit( &argc, argv );    glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);    glutCreateWindow("week12 hw4");
    glutDisplayFunc(display);
    ///下面是從 GLUT專案main.cpp剪貼來的    glEnable(GL_DEPTH_TEST);    glDepthFunc(GL_LESS);
    glEnable(GL_LIGHT0);    glEnable(GL_NORMALIZE);    glEnable(GL_COLOR_MATERIAL);    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    myTexture("Diffuse.jpg");///如果只有1張,就不用記 id 了啦
    glutMainLoop();}







距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...