2018年6月11日 星期一

week16 矮矮的筆記 期末作品

期末作品展示


完整程式碼:

#include <GL/glut.h>
#include <stdio.h>///(0)外掛
#include "glm.h"
#include <mmsystem.h>
GLMmodel*pmodel=NULL;
GLMmodel*pmodel2=NULL;
GLMmodel*pmodel3=NULL;
GLMmodel*pmodel4=NULL;
GLMmodel*pmodel5=NULL;
GLMmodel*pmodel6=NULL;
GLMmodel*pmodel7=NULL;
GLMmodel*pmodel8=NULL;
GLMmodel*pmodel9=NULL;
GLMmodel*pmodel10=NULL;
GLMmodel*pmodel11=NULL;
FILE * fout=NULL;///(1)指標
FILE * fin=NULL;
float angle[20], angleNew[20], angleOld[20], oldX=0, oldY=0;
int ID=0;
void timer(int t)
{///一開始t是0, 接下來是t+1為1, 2,3, .... 9
    glutTimerFunc(33, timer, t+1);
    if(t%30==0){///每10frame讀下一筆資料
        ///要新舊去內插
        for(int i=0;i<20;i++){
            angleOld[i] = angleNew[i];///備份,新的就變成舊的了
            fscanf(fin, "%f", &angleNew[i]);
        }///前面都跟 read一樣
    }
    ///內插,每次都要做啦
    float alpha= (t%30)/30.0;///介於0.0 ... 1.0
    for(int i=0;i<20;i++){
        angle[i] = alpha*angleNew[i] + (1-alpha)*angleOld[i];
    }
    glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0') ID=0;
    if(key=='1') ID=1;
    if(key=='2') ID=2;
    if(key=='3') ID=3;
    if(key=='4') ID=4;
    if(key=='5') ID=5;
    if(key=='s' || key=='S' || key=='w' ||key=='W'){
        if(fout==NULL) fout=fopen("output.txt", "w+");
        for(int i=0;i<20;i++){
            fprintf(fout, "%.2f ", angle[i]);
        }///空格很重要, 少了客格,一堆數字就黏起來了
        fprintf(fout, "\n");
    }
    if(key=='r' || key=='R'){///一次讀一行/一個動作
        if(fin==NULL) fin=fopen("output.txt", "r");
        for(int i=0;i<20;i++){
            fscanf(fin, "%f", &angle[i]);
        }
    }
    ///主角: 自動播放的內插
    if(key=='p' || key=='P'){///Play, 起個頭,然後後面全自動播放
        PlaySound("music.wav", NULL, SND_ASYNC);
        if(fin==NULL) fin=fopen("output.txt", "r");
        for(int i=0;i<20;i++){
            fscanf(fin, "%f", &angleNew[i]);
        }///前面都跟 read一樣
        glutTimerFunc(100, timer, 0);///與眾不同的地方
    }
    glutPostRedisplay();
}
void motion(int x, int y)
{
    angle[ID] += (x-oldX);
    oldX = x;
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    oldX=x; oldY=y;
}
void display()
{
    glClearColor(1 , 0.2 , 0.8 , 0.3 );
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        if(!pmodel)
            {
                pmodel = glmReadOBJ("body.obj");
                pmodel2 = glmReadOBJ("cloud.obj");
                pmodel3 = glmReadOBJ("eyeL.obj");
                pmodel4 = glmReadOBJ("eyeR.obj");
                pmodel5 = glmReadOBJ("handL.obj");
                pmodel6 = glmReadOBJ("handR.obj");
                pmodel7 = glmReadOBJ("head.obj");
                pmodel8 = glmReadOBJ("legL.obj");
                pmodel9 = glmReadOBJ("legR.obj");
                pmodel10 = glmReadOBJ("mouse.obj");
                pmodel11 = glmReadOBJ("nose.obj");



                if(!pmodel)exit(0);
                glmUnitize(pmodel);
                glmFacetNormals(pmodel);
                glmVertexNormals(pmodel,90.0);
                if(!pmodel2)exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2,90.0);
                if(!pmodel3)exit(0);
                glmUnitize(pmodel3);
                glmFacetNormals(pmodel3);
                glmVertexNormals(pmodel3,90.0);
                if(!pmodel4)exit(0);
                glmUnitize(pmodel4);
                glmFacetNormals(pmodel4);
                glmVertexNormals(pmodel4,90.0);
                if(!pmodel5)exit(0);
                glmUnitize(pmodel5);
                glmFacetNormals(pmodel5);
                glmVertexNormals(pmodel5,90.0);
                if(!pmodel6)exit(0);
                glmUnitize(pmodel6);
                glmFacetNormals(pmodel6);
                glmVertexNormals(pmodel6,90.0);
                if(!pmodel7)exit(0);
                glmUnitize(pmodel7);
                glmFacetNormals(pmodel7);
                glmVertexNormals(pmodel7,90.0);
                if(!pmodel8)exit(0);
                glmUnitize(pmodel8);
                glmFacetNormals(pmodel8);
                glmVertexNormals(pmodel8,90.0);
                if(!pmodel9)exit(0);
                glmUnitize(pmodel9);
                glmFacetNormals(pmodel9);
                glmVertexNormals(pmodel9,90.0);
                if(!pmodel10)exit(0);
                glmUnitize(pmodel10);
                glmFacetNormals(pmodel10);
                glmVertexNormals(pmodel10,90.0);
                if(!pmodel11)exit(0);
                glmUnitize(pmodel11);
                glmFacetNormals(pmodel11);
                glmVertexNormals(pmodel11,90.0);

            }
     glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
    //glPushMatrix();
        glPushMatrix();
            glTranslatef(-0.15, 0.2 , -1);
            glScalef(0.22,0.22,0.22);
            glmDraw(pmodel3 , GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef(0.15, 0.2 , -1);
            glScalef(0.22,0.22,0.22);
            glmDraw(pmodel4 , GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef( -0.01 , 0.07 , -1);
            glScalef(0.22,0.22,0.22);
            glmDraw(pmodel11 , GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glTranslatef( -0.01 , -0.08 , -1);
            glScalef(0.22,0.22,0.22);
            glmDraw(pmodel10 , GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glRotatef( angle[0], 0 , 0 , -0.5);
            glPushMatrix();
                glTranslatef( -0.58 , 0 , 0.2);
                glScalef(0.86,0.86,0.86);
                glRotatef( 30, 0 , 1 , 0 );
                glmDraw(pmodel5 , GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
         glPushMatrix();
            glRotatef( angle[1], 0 , 0 , 1);
            glPushMatrix();
                glTranslatef( 0.58 , 0 , 0.2 );
                glScalef(0.86,0.86,0.86);
                glRotatef(-30, 0 , 1 , 0 );
                glmDraw(pmodel6 , GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glTranslatef( 0 , 0.55 , 0);
            glScalef(0.5,0.5,0.5);
            glRotatef(-90, 1 , 0 , 0 );
            glTranslatef(0 , 0 , 0 );
            glRotatef( angle[4], 0 , 1 , 0);
            glmDraw(pmodel7 , GLM_SMOOTH | GLM_MATERIAL);
        glPopMatrix();
        glPushMatrix();
            glRotatef( angle[2], -1 , 0 , 0);
            glPushMatrix();
                glTranslatef( -0.25 , -0.7 , 0 );
                glScalef( 1.25, 1.25 ,1.25 );
                glmDraw(pmodel8 , GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glRotatef( angle[3], 1 , 0 , 0);
            glPushMatrix();
                glTranslatef( 0.25 , -0.7 , 0 );
                glScalef(1.25 , 1.25 , 1.25);
                glTranslatef(0 , 0 , 0 );
                glmDraw(pmodel9 , GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
         glPushMatrix();
            glRotatef( angle[5], 0 , 0.5 , 0);
            glPushMatrix();
                glTranslatef( -0.65 , 0.7 , 0 );
                glScalef(0.5 , 0.5 , 0.5);
                glTranslatef(0 , 0 , 0 );
                glmDraw(pmodel2 , GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();


    //glPopMatrix();
    glutSwapBuffers();
}
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 };

/* Program entry point */

int main(int argc, char *argv[])
{
    //PlaySound("music.wav", NULL, SND_ASYNC);
    glutInit(&argc, argv);
    glutInitWindowSize(600,600);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("final");

    ///glutReshapeFunc(resize);
    glutDisplayFunc(display);
    ///glutKeyboardFunc(key);
    ///glutIdleFunc(idle);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutKeyboardFunc(keyboard);

    glClearColor(1,1,1,1);
    ///glEnable(GL_CULL_FACE);
    ///glCullFace(GL_BACK);

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

    return EXIT_SUCCESS;
}

沒有留言:

張貼留言