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();

}

沒有留言:

張貼留言

距地表面160 Week11

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