2020年6月30日 星期二

期末作業_會跳舞的機器人

#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
#include <GL/glut.h>
#include "glm.h"
#include "CMP3_MCI.h"
#include <opencv/highgui.h>
#include <opencv/cv.h>
CMP3_MCI myMP3;
GLMmodel*model=NULL;
GLMmodel*mode2=NULL;
GLMmodel*mode3=NULL;
GLMmodel*mode4=NULL;
GLMmodel*mode5=NULL;
GLMmodel*mode6=NULL;
GLMmodel*mode7=NULL;




int angle[15]={};
int angleID=0;
int oldX, oldY;

GLUquadric * quad;
GLuint id;
void motion(int x, int y);
void mouse(int button, int state, int x, int y);
void keyboard(unsigned char key, int x, int y);
void saveAll();

const GLfloat light_ambient[]  = { 4.0f, 4.0f, 4.0f, 4.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, -10.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 oldAngle[15];
int newAngle[15];

int myTexture(char *filename)

{

    IplImage * img = cvLoadImage(filename);

    cvCvtColor(img,img, CV_BGR2RGB);

    glEnable(GL_TEXTURE_2D);

    GLuint id;

    glGenTextures(1, &id);

    glBindTexture(GL_TEXTURE_2D, id);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    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;

}


void myInit()

{   quad = gluNewQuadric();

    id = myTexture("tree.png");

}





void timer(int  t)
{
    glutTimerFunc(60,timer,t+1);
    if(t==0){
        if(fin==NULL)fin=fopen("motion.txt","r");
        for(int i=0;i<15;i++){
            fscanf(fin,"%d",&newAngle[i]);
        }
    }
    if(t%10==0){
        for(int i=0;i<15;i++){
            oldAngle[i]=newAngle[i];
            fscanf(fin,"%d",&newAngle[i]);
        }
    }
    float Alpha=(t%10)/10.0;
    for(int i=0;i<15;i++)
    {
        angle[i]=Alpha*newAngle[i]+(1-Alpha)*oldAngle[i];
    }
    glutPostRedisplay();
}
void drawBody()
{
    if(model==NULL){
        model = glmReadOBJ("body.obj");
        glmUnitize(model);
        glmFacetNormals(model);
        glmVertexNormals(model, 90);
    }


    if(mode2==NULL){
        mode2 = glmReadOBJ("head.obj");
        glmUnitize(mode2);
        glmFacetNormals(mode2);
        glmVertexNormals(mode2, 90);
    }
    if(mode3==NULL){
        mode3 = glmReadOBJ("lf.obj");
        glmUnitize(mode3);
        glmFacetNormals(mode3);
        glmVertexNormals(mode3, 90);
    }
    if(mode4==NULL){
        mode4 = glmReadOBJ("lh.obj");
        glmUnitize(mode4);
        glmFacetNormals(mode4);
        glmVertexNormals(mode4, 90);
    }
    if(mode5==NULL){
        mode5 = glmReadOBJ("rf.obj");
        glmUnitize(mode5);
        glmFacetNormals(mode5);
        glmVertexNormals(mode5, 90);
    }
    if(mode6==NULL){
        mode6 = glmReadOBJ("rh.obj");
        glmUnitize(mode6);
        glmFacetNormals(mode6);
        glmVertexNormals(mode6, 90);
    }
       if(mode7==NULL){
        mode7 = glmReadOBJ("teal.obj");
        glmUnitize(mode7);
        glmFacetNormals(mode7);
        glmVertexNormals(mode7, 90);
    }

    glPushMatrix();///TODO:身體
        glTranslatef(0,0,0);
        glRotatef(angle[1],0,1,0);
        glRotatef(angle[2],1,0,0);
        glTranslatef(0,0,0);
        glScalef(1,1,1);
        glRotatef(-90, 0,1,0);

            glPushMatrix();///TODO:頭
                glTranslatef(0,0.0,0.5);
                glRotatef(angle[3],1,0,0);
                glRotatef(angle[4],0,0,1);
                glTranslatef(0,0.2,0.2);
                glScalef(1.2,1.2,1.2);
                glRotatef(0, 0,0,0);
                glmDraw(mode2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:左腳
                glTranslatef(0.2,-0.1,-0.2);
                glRotatef(angle[5],1,0,0);
                glRotatef(angle[6],0,0,1);
                glTranslatef(0,-0.5,-0.1);
                glScalef(0.5,0.5,0.5);
                glRotatef(0, 0,0,0);
                glmDraw(mode3, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:左手
                glTranslatef(-0.12,-0.12,0.2);
                glRotatef(angle[7],1,0,0);
                glRotatef(angle[8],0,0,1);
                glTranslatef(0,-0.2,0);
                glScalef(0.7,0.7, 0.7);
                glRotatef(0, 0,0,0);
                glmDraw(mode4, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();


            glPushMatrix();///TODO:右腳
                glTranslatef(-0.2,-0.1,-0.2);
                glRotatef(angle[9],1,0,0);
                glRotatef(angle[10],0,0,1);
                glTranslatef(0,-0.5,-0.1);
                glScalef(0.5,0.5,0.5);
                glRotatef(0, 0,0,0);
                glmDraw(mode5, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:右手
                glTranslatef(0.18,-0.13,0.2);
                glRotatef(angle[11],1,0,0);
                glRotatef(angle[12],0,0,1);
                glTranslatef(0,-0.2,0);
                glScalef(0.7, 0.7, 0.7);
                glRotatef(0, 0,1,0);
                glmDraw(mode6, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

            glPushMatrix();///TODO:尾巴
                glTranslatef(0,0.1,-0.3);
                glRotatef(angle[13],1,0,0);
                glRotatef(angle[14],0,0,1);
                glTranslatef(0,0.2,-0.8);
                glScalef(1.2, 1.2, 1.2);
                glRotatef(0, 0,0,0);
                glmDraw(mode7, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

        glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();

}
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;
}
void saveAll()
{
    if(fout==NULL) fout=fopen("motion.txt", "w+");
    for(int i=0; i<15; i++){
         printf("%d ", angle[i]);
        fprintf(fout,"%d ", angle[i]);
    }
     printf("\n");
    fprintf(fout, "\n");
}

void motion(int x, int y)
{
    angle[angleID] += (x-oldX);
    oldX=x;
    glutPostRedisplay();///TODO2:重畫畫面
}
void readAll()
{
    if(fin==NULL) fin=fopen("motion.txt", "r");///TODO4 開檔
    for(int i=0; i<15; i++){
        fscanf(fin, "%d", &angle[i]);///TODO4 讀檔
    }
}

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

{///TODO2: 鍵盤,選angleID
    if(key=='0') angleID=0;
    if(key=='1') angleID=1;
    if(key=='2') angleID=2;
    if(key=='3') angleID=3;
    if(key=='4') angleID=4;
    if(key=='5') angleID=5;
    if(key=='6') angleID=6;
    if(key=='7') angleID=7;
    if(key=='8') angleID=8;
    if(key=='9') angleID=9;
    if(key=='a') angleID=10;
    if(key=='b') angleID=11;
    if(key=='c') angleID=12;
    if(key=='d') angleID=13;
    if(key=='e') angleID=14;
    if(key=='s') saveAll();///記住動作
    if(key=='r')
    {
        readAll();
        glutPostRedisplay();///TODO4 重畫
    }
     if(key=='p'){
        glutTimerFunc(0,timer,0);
    }

}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glColor3f (1,1,1);
    glBegin(GL_POLYGON);
    glTexCoord2f(0,0);glVertex2f(-1,+1);
    glTexCoord2f(0,1);glVertex2f(-1,-1);
    glTexCoord2f(1,1);glVertex2f(+1,-1);
    glTexCoord2f(1,0);glVertex2f(+1,+1);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glPushMatrix();
      glTranslatef(0,-0.08,-0.5);
      glScalef(0.6,0.6,0.6);
    drawBody();
    glPopMatrix();
    glutSwapBuffers();
}


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(650 ,650);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("07160245");
    glutDisplayFunc(display);
    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);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    myMP3.Load("music.mp3");
    myInit();
    myMP3.Play();
    glutMainLoop();
}

影片連結:https://youtu.be/n0ImtQqnugI

沒有留言:

張貼留言