2021年6月9日 星期三

電腦圖學week16

1.延續上週進度 Timer 改 motion + mouse

#include <stdio.h>///可割可棄

#include <GL/glut.h>

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

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

int oldx=0;

👉void timer( int t )

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

{

    oldx=x;

}

👉void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;


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


}


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

{

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

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

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

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

}

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


    👉glutMouseFunc(mouse);

    👉glutMotionFunc(motion);

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

    glutTimerFunc(0, timer, 0);///

    glutDisplayFunc(display);

    glutMainLoop();

}

2.讀取檔案

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

void timer( int t )

{

}

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

{

    oldx=x;

}

void motion(int x,int y)

{

    angle[angleID]+=x-oldx;

    oldx=x;


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

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

    👉for(int i=0;i<20;i++)fprintf(fout,"#.lf",angle[i]);

    👉fprintf(fout,"\n");

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

    👉printf("\n");

}


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

{

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

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

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

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

}

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


    glutMouseFunc(mouse);

    glutMotionFunc(motion);

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

    glutTimerFunc(0, timer, 0);

    glutDisplayFunc(display);

    glutMainLoop();

}

沒有留言:

張貼留言

距地表面160 Week11

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