2016年6月13日 星期一

★RiSu★03160516_莊昀笙, Week17, 期末作業,

(1)影片:https://www.youtube.com/watch?v=Q2_hIkSW5hI

(2)
#include <stdio.h>
#include <GL/glut.h>
#include "glm.h"
#include <windows.h>
#include <mmsystem.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
GLMmodel * pmodel=NULL;
GLMmodel * pmode2=NULL;
GLMmodel * pmode3=NULL;
GLMmodel * pmode4=NULL;
GLMmodel * pmode5=NULL;
GLMmodel * pmode6=NULL;
GLMmodel * pmode7=NULL;
GLMmodel * pmode8=NULL;
GLMmodel * pmode9=NULL;
GLMmodel * pmode10=NULL;
GLMmodel * pmode11=NULL;
GLMmodel * pmode12=NULL;
GLMmodel * pmode13=NULL;
GLMmodel * pmode14=NULL;
float rot[27]={0}, rotOld[27]={0}, rotNew[27]={0};
int rotNow=0, oldX=0, oldY=0;;
FILE *fout=0, *fin=0;
GLfloat light_ambient[] = {0, 0, 0, 0};
GLfloat light_diffuse[] = {1.5, 1.5, 1.5, 1};
GLfloat light_specular[] = {0, 0, 0, 0};
GLfloat light_position[] = {0.0f, 2.0f, -2.0f, 1.0f};
void timer(int t)
{
    float alpha=(t%10)/10.0;///!!!!
    //pos = newX*alpha+oldX*(1-alpha);
    if(t%10==0){
        if(fin==NULL) fin=fopen("motion.txt", "r");
        for(int i=0;i<27;i++){
            rotOld[i]=rotNew[i];
            fscanf(fin, "%f", &rotNew[i]);
        }
    }
    for(int i=0;i<27;i++){
        rot[i]=rotNew[i]*alpha+rotOld[i]*(1-alpha);
    }
    glutTimerFunc(100, timer, t+1);
    glutPostRedisplay();
}
#include <stdio.h>
void display()
{
    glClearColor(2,0.2,0.2,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glLoadIdentity();
            gluLookAt(rot[0]/80.0,1,5,
              0,0,0,
              0,1,0);
        glTranslatef(0.0,0.0,0.0);
        glRotatef(rot[24],0,0,1);
        glTranslatef(0,0,0);

        glTranslatef(0.0,0.0,0.0);
        glRotatef(rot[25],0,1,0);
        glTranslatef(0,0,0);

        glTranslatef(0.0,0.0,0.0);
        glRotatef(rot[26],1,0,0);
        glTranslatef(0,0,0);

        glPushMatrix();
            glTranslatef(0.0,0.0,0.0);
            glRotatef(rot[1],0,0,1);
            glTranslatef(0,0,0);

            glTranslatef(0.0,0.0,0.0);
            glRotatef(rot[2],0,1,0);
            glTranslatef(0,0,0);

            glTranslatef(0.0,0.0,0.0);
            glRotatef(rot[3],1,0,0);
            glTranslatef(0,0,0);
            if(!pmodel)
            {
                pmodel = glmReadOBJ("data/03160516_1.obj");
                if(!pmodel) exit(0);
                glmUnitize(pmodel);
                glmFacetNormals(pmodel);
                glmVertexNormals(pmodel, 90.0);
            }
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

        glPopMatrix();

        glPushMatrix();

            glPushMatrix();
                glTranslatef(-0.3,0.2,0.0);
                glRotatef(rot[4],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0.0);
                glRotatef(rot[5],1,0,0);
                glTranslatef(0.0,0,0);
                if(!pmode2)
                {
                    pmode2 = glmReadOBJ("data/03160516_H1.obj");
                    if(!pmode2) exit(0);
                    glmUnitize(pmode2);
                    glmFacetNormals(pmode2);
                    glmVertexNormals(pmode2, 0.0);
                }
                glmDraw(pmode2, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(-0.02,-0.25,0);
                glRotatef(rot[6],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0);
                glRotatef(rot[7],1,0,0);
                glTranslatef(0.0,0.0,0);

                glScalef(0.7,0.7,0.7);
                if(!pmode3)
                {
                    pmode3 = glmReadOBJ("data/03160516_H2.obj");
                    if(!pmode3) exit(0);
                    glmUnitize(pmode3);
                    glmFacetNormals(pmode3);
                    glmVertexNormals(pmode3, 0.0);
                }
                glmDraw(pmode3, GLM_SMOOTH | GLM_MATERIAL);


                glTranslatef(0.0,-0.25,0);
                glTranslatef(0.0,0,0);
                if(!pmode4)
                {
                    pmode4 = glmReadOBJ("data/03160516_H3.obj");
                    if(!pmode4) exit(0);
                    glmUnitize(pmode4);
                    glmFacetNormals(pmode4);
                    glmVertexNormals(pmode4, 0.0);
                }
                glmDraw(pmode4, GLM_SMOOTH | GLM_MATERIAL);

            glPopMatrix();

            glPushMatrix();
                glTranslatef(0.3,0.2,0.0);
                glRotatef(rot[8],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0.0);
                glRotatef(rot[9],1,0,0);
                glTranslatef(0.0,0,0);

                if(!pmode5)
                {
                    pmode5 = glmReadOBJ("data/03160516_H4.obj");
                    if(!pmode5) exit(0);
                    glmUnitize(pmode5);
                    glmFacetNormals(pmode5);
                    glmVertexNormals(pmode5, 0.0);
                }
                glmDraw(pmode5, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.02,-0.25,0);
                glRotatef(rot[10],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0,0,0);
                glRotatef(rot[11],1,0,0);
                glTranslatef(0.0,0,0);

                glScalef(0.7,0.7,0.7);

                if(!pmode6)
                {
                    pmode6 = glmReadOBJ("data/03160516_H5.obj");
                    if(!pmode6) exit(0);
                    glmUnitize(pmode6);
                    glmFacetNormals(pmode6);
                    glmVertexNormals(pmode6, 0.0);
                }
                glmDraw(pmode6, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.0,-0.25,0);
                glTranslatef(0.0,0,0);

                if(!pmode7)
                {
                    pmode7 = glmReadOBJ("data/03160516_H6.obj");
                    if(!pmode7) exit(0);
                    glmUnitize(pmode7);
                    glmFacetNormals(pmode7);
                    glmVertexNormals(pmode7, 0.0);
                }
                glmDraw(pmode7, GLM_SMOOTH | GLM_MATERIAL);

            glPopMatrix();

            glPushMatrix();
                glTranslatef(-0.15,-0.45,0.0);
                glRotatef(rot[12],1,0,0);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0.0);
                glRotatef(rot[13],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0);
                glRotatef(rot[14],1,0,0);
                glTranslatef(0.0,0,0);

                glScaled(0.45,0.45,0.45);

                if(!pmode8)
                {
                    pmode8 = glmReadOBJ("data/03160516_L1.obj");
                    if(!pmode8) exit(0);
                    glmUnitize(pmode8);
                    glmFacetNormals(pmode8);
                    glmVertexNormals(pmode8, 0.0);
                }
                glmDraw(pmode8, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.0,-0.55,0);
                glRotatef(rot[15],1,0,0);
                glTranslatef(0.0,0,0);

                glScaled(0.35,0.35,0.35);

                if(!pmode9)
                {
                    pmode9 = glmReadOBJ("data/03160516_L2.obj");
                    if(!pmode9) exit(0);
                    glmUnitize(pmode9);
                    glmFacetNormals(pmode9);
                    glmVertexNormals(pmode9, 0.0);
                }
                glmDraw(pmode9, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.0,-1.25,0);
                glRotatef(rot[16],1,0,0);
                glTranslatef(0.0,0,0);

                if(!pmode10)
                {
                    pmode10 = glmReadOBJ("data/03160516_L6.obj");
                    if(!pmode10) exit(0);
                    glmUnitize(pmode10);
                    glmFacetNormals(pmode10);
                    glmVertexNormals(pmode10, 0.0);
                }
                glmDraw(pmode10, GLM_SMOOTH | GLM_MATERIAL);

            glPopMatrix();

            glPushMatrix();
                glTranslatef(0.15,-0.45,0.0);
                glRotatef(rot[17],1,0,0);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0.0);
                glRotatef(rot[18],0,0,1);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0);
                glRotatef(rot[19],1,0,0);
                glTranslatef(0.0,0,0);

                glScaled(0.45,0.45,0.45);

                if(!pmode11)
                {
                    pmode11 = glmReadOBJ("data/03160516_L1.obj");
                    if(!pmode11) exit(0);
                    glmUnitize(pmode11);
                    glmFacetNormals(pmode11);
                    glmVertexNormals(pmode11, 0.0);
                }
                glmDraw(pmode11, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.0,-0.55,0);
                glRotatef(rot[20],1,0,0);
                glTranslatef(0.0,0,0);

                glScaled(0.35,0.35,0.35);

                if(!pmode12)
                {
                    pmode12 = glmReadOBJ("data/03160516_L2.obj");
                    if(!pmode12) exit(0);
                    glmUnitize(pmode12);
                    glmFacetNormals(pmode12);
                    glmVertexNormals(pmode12, 0.0);
                }
                glmDraw(pmode12, GLM_SMOOTH | GLM_MATERIAL);

                glTranslatef(0.0,-1.25,0);
                glRotatef(rot[21],1,0,0);
                glTranslatef(0.0,0,0);

                if(!pmode13)
                {
                    pmode13 = glmReadOBJ("data/03160516_L6.obj");
                    if(!pmode13) exit(0);
                    glmUnitize(pmode13);
                    glmFacetNormals(pmode13);
                    glmVertexNormals(pmode13, 0.0);
                }
                glmDraw(pmode13, GLM_SMOOTH | GLM_MATERIAL);

            glPopMatrix();

            glPushMatrix();
                glTranslatef(0.0,0.45,0.0);
                glRotatef(rot[22],0,1,0);
                glTranslatef(0.0,0,0);

                glTranslatef(0.0,0.0,0.0);
                glRotatef(rot[23],1,0,0);
                glTranslatef(0.0,0,0);

                glScaled(1.35,1.35,1.35);

                if(!pmode14)
                {
                    pmode14 = glmReadOBJ("data/03160516_H.obj");
                    if(!pmode14) exit(0);
                    glmUnitize(pmode14);
                    glmFacetNormals(pmode14);
                    glmVertexNormals(pmode14, 0.0);
                }
                glmDraw(pmode14, GLM_SMOOTH | GLM_MATERIAL);

            glPopMatrix();

        glPopMatrix();

    glPopMatrix();
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0') rotNow=0;
    if(key=='z') rotNow=1;
    if(key=='x') rotNow=2;
    if(key=='c') rotNow=3;
    if(key=='1') rotNow=4;
    if(key=='2') rotNow=5;
    if(key=='3') rotNow=6;
    if(key=='4') rotNow=7;
    if(key=='5') rotNow=8;
    if(key=='6') rotNow=9;
    if(key=='7') rotNow=10;
    if(key=='8') rotNow=11;
    if(key=='q') rotNow=12;
    if(key=='w') rotNow=13;
    if(key=='e') rotNow=14;
    if(key=='r') rotNow=15;
    if(key=='t') rotNow=16;
    if(key=='y') rotNow=17;
    if(key=='u') rotNow=18;
    if(key=='i') rotNow=19;
    if(key=='o') rotNow=20;
    if(key=='p') rotNow=21;
    if(key=='f') rotNow=22;
    if(key=='g') rotNow=23;
    if(key=='h') rotNow=24;
    if(key=='j') rotNow=25;
    if(key=='k') rotNow=26;
    if(key=='a'){
        if(fin==NULL) fin=fopen("motion.txt", "r");
        for(int i=0;i<27;i++){
            fscanf(fin, "%f", &rot[i]);
        }
    }
    if(key=='d'){
        myMP3.Load("Drop.mp3");
        myMP3.Play();
        if(fin==NULL) fin=fopen("motion.txt", "r");
        for(int i=0;i<27;i++){
            fscanf(fin, "%f", &rotNew[i]);
        }
        glutTimerFunc(100,timer, 0);
        glutPostRedisplay();
    }
    if(key=='s'){
        if(fout==NULL) fout=fopen("motion.txt", "w+");
        for(int i=0;i<27;i++){
            fprintf(fout, "%3.1f ", rot[i]);
            printf("%3.1f ", rot[i]);
        }
        fprintf(fout, "\n");
        printf("\n");
    }
    glutPostRedisplay();
}
void motion(int x, int y)
{
    rot[rotNow] += x-oldX;
    oldX = x;
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    if(state==GLUT_DOWN){
        oldX=x; oldY=y;
    }
}

void resize(int w,int h)
{
    glViewport(0,0, (GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(30.0, (GLdouble)w/h,1.0,100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,0.0,0.0,
              0.0,0.0,0.0,
              0.0,0.0,0.0);
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("03160516");
    glutDisplayFunc(display);

    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);
    glutReshapeFunc(resize);
    glutMouseFunc(mouse);
    glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
    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);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);

    glutMainLoop();
}

沒有留言:

張貼留言