2018年7月1日 星期日

Week 17 邱顯傑

期末作品展示(Coding)

youtube連結:https://youtu.be/1Bh3QzzA5n8
操控關節0~9 a~i
s w寫入
p播放
r重讀紀錄

#include "glm.h"
#include <stdio.h>
#include <GL/glut.h>
#include <mmsystem.h>
#include "CMP3_MCI.h"
GLMmodel* pmodel = NULL;
GLMmodel* right1 = NULL;
GLMmodel* right2 = NULL;
GLMmodel* right31 = NULL;
GLMmodel* right32 = NULL;
GLMmodel* left1 = NULL;
GLMmodel* left2 = NULL;
GLMmodel* left31 = NULL;
GLMmodel* left32 = NULL;
GLMmodel* head = NULL;
GLMmodel* head2 = NULL;
GLMmodel* head3 = NULL;
GLMmodel* right4 = NULL;
GLMmodel* left4 = NULL;
FILE * fout=NULL;
FILE * fin = NULL;
CMP3_MCI ado1;
float angle[20]={0},angleNew[20],angleOld[20];
int now=0;
int oldX=0, oldY=0;///oldx,oldy為了瞭解原本已經走了多少

void timer (int t){
    /*if(t<=198)
    glutTimerFunc(33,timer,t+1);
    else ado1.Stop();*/
    glutTimerFunc(33,timer,t+1);
    if(t%30==0){
        for(int i=0;i<20;i++){
            angleOld[i]=angleNew[i];
            fscanf(fin, "%f", &angleNew[i]);
        }
    }
    float alpha=(t%30)/30.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'>=0 && key-'0'<=9) now=key-'0';   ///用數字鍵來切換關節
    if(key-'a'>=0 && key-'a'<=9) now=key-'a'+10;
    if(key=='s' ||key=='S' ||key=='w' ||key=='W' ){ ///啟用檔案
        if(fout==NULL) fout=fopen("output.txt", "w+");
        for(int i=0;i<20;i++){
            printf("%.3f ",angle[i]);
            fprintf(fout, "%.3f ",angle[i]);
        }
        printf("\n");
        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]);
            printf("%.2f ", angle[i]);
        }
        printf("\n");
    }
    if(key=='p' || key=='P'){
        if(fin==NULL) fin=fopen("output.txt", "r");
        for(int i=0;i<20;i++){
            fscanf(fin, "%f", &angleNew[i]);
        }

        ado1.Load("music/enter.mp3");
        ado1.Play();
        glutTimerFunc(33, timer, 1);
    }

    glutPostRedisplay();
}


static void display(void)
{
    glClearColor(0.96, 0.87, 0.7,1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle[13],1,1,0);

        glRotatef(angle[16],1,0,0);
        glRotatef(angle[17],0,1,0);
        glRotatef(angle[18],0,0,1);
        glScalef(angle[15]*0.008,angle[15]*0.008,angle[15]*0.008);
        glTranslatef(angle[14]*0.01,0,0);
        ///glScalef(0.8,0.8,0.8);

        if (!pmodel) {
            pmodel = glmReadOBJ("data/body.obj");
            if (!pmodel) exit(0);
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel, 90.0);
        }
        if (!right1) {
            right1 = glmReadOBJ("data/right1.obj");
            if (!right1) exit(0);
            glmUnitize(right1);
            glmFacetNormals(right1);
            glmVertexNormals(right1, 90.0);
        }
        if (!right2) {
            right2 = glmReadOBJ("data/right2.obj");
            if (!right2) exit(0);
            glmUnitize(right2);
            glmFacetNormals(right2);
            glmVertexNormals(right2, 90.0);
        }
        if (!right31) {
            right31 = glmReadOBJ("data/right3.1.obj");
            if (!right31) exit(0);
            glmUnitize(right31);
            glmFacetNormals(right31);
            glmVertexNormals(right31, 90.0);
        }
        if (!right32) {
            right32 = glmReadOBJ("data/right3.2.obj");
            if (!right32) exit(0);
            glmUnitize(right32);
            glmFacetNormals(right32);
            glmVertexNormals(right32, 90.0);
        }
       if (!left1) {
            left1 = glmReadOBJ("data/left1.obj");
            if (!left1) exit(0);
            glmUnitize(left1);
            glmFacetNormals(left1);
            glmVertexNormals(left1, 90.0);
        }
        if (!left2) {
            left2 = glmReadOBJ("data/left2.obj");
            if (!left2) exit(0);
            glmUnitize(left2);
            glmFacetNormals(left2);
            glmVertexNormals(left2, 90.0);
        }
        if (!left31) {
            left31 = glmReadOBJ("data/left3.1.obj");
            if (!left31) exit(0);
            glmUnitize(left31);
            glmFacetNormals(left31);
            glmVertexNormals(left31, 90.0);
        }
        if (!left32) {
            left32 = glmReadOBJ("data/left3.2.obj");
            if (!left32) exit(0);
            glmUnitize(left32);
            glmFacetNormals(left32);
            glmVertexNormals(left32, 90.0);
        }
        if (!head) {
            head = glmReadOBJ("data/head.obj");
            if (!head) exit(0);
            glmUnitize(head);
            glmFacetNormals(head);
            glmVertexNormals(head, 90.0);
        }
        if (!head2) {
            head2 = glmReadOBJ("data/head2.obj");
            if (!head2) exit(0);
            glmUnitize(head2);
            glmFacetNormals(head2);
            glmVertexNormals(head2, 90.0);
        }
        if (!head3) {
            head3 = glmReadOBJ("data/head3.obj");
            if (!head3) exit(0);
            glmUnitize(head3);
            glmFacetNormals(head3);
            glmVertexNormals(head3, 90.0);
        }
        if (!right4) {
            right4 = glmReadOBJ("data/right4.obj");
            if (!right4) exit(0);
            glmUnitize(right4);
            glmFacetNormals(right4);
            glmVertexNormals(right4, 90.0);
        }
        if (!left4) {
            left4 = glmReadOBJ("data/left4.obj");
            if (!left4) exit(0);
            glmUnitize(left4);
            glmFacetNormals(left4);
            glmVertexNormals(left4, 90.0);
        }
        glPushMatrix();///備分矩陣
            glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);///身體


            glPushMatrix();///右邊手
                glTranslatef(0.32,0.3,0);
                glRotatef(angle[1],1,0,0);
                glTranslatef(0,-0.1,0);
                glmDraw(right1, GLM_SMOOTH | GLM_MATERIAL);
                glPushMatrix();
                    glTranslatef(0.01,-0.15,0);
                    glRotatef(angle[2],1,0,0);
                    glTranslatef(0,-0.1,0);
                    glmDraw(right2, GLM_SMOOTH | GLM_MATERIAL);
                    glPushMatrix();
                        glTranslatef(0.03,-0.13,0);
                        glRotatef(angle[3],0,0,1);
                        glTranslatef(0.03,-0.11,0);
                        glmDraw(right31, GLM_SMOOTH | GLM_MATERIAL);
                    glPopMatrix();
                    glPushMatrix();
                        glTranslatef(0.01,-0.13,0);
                        glRotatef(angle[4],0,0,1);
                        glTranslatef(-0.05,-0.11,0);
                        glmDraw(right32, GLM_SMOOTH | GLM_MATERIAL);
                    glPopMatrix();
                glPopMatrix();
            glPopMatrix();


            glPushMatrix();///左邊手
                glTranslatef(-0.32,0.3,0);
                glRotatef(angle[5],1,0,0);
                glTranslatef(0,-0.1,0);
                glmDraw(left1, GLM_SMOOTH | GLM_MATERIAL);
                glPushMatrix();
                    glTranslatef(-0.01,-0.15,0);
                    glRotatef(angle[6],1,0,0);
                    glTranslatef(0,-0.1,0);
                    glmDraw(left2, GLM_SMOOTH | GLM_MATERIAL);
                    glPushMatrix();
                        glTranslatef(-0.0,-0.13,0);
                        glRotatef(angle[7],0,0,1);
                        glTranslatef(0.03,-0.11,0);
                        glmDraw(left31, GLM_SMOOTH | GLM_MATERIAL);
                    glPopMatrix();
                    glPushMatrix();
                        glTranslatef(-0.01,-0.13,0);
                        glRotatef(angle[8],0,0,1);
                        glTranslatef(-0.05,-0.11,0);
                        glmDraw(left32, GLM_SMOOTH | GLM_MATERIAL);
                    glPopMatrix();
                glPopMatrix();
            glPopMatrix();


            glPushMatrix();///頭
                glRotatef(180,0,1,0);
                glTranslatef(0,0.35,0);
                glRotatef(angle[9],0,0,1);
                glTranslatef(0,0.2,0);
                glmDraw(head, GLM_SMOOTH | GLM_MATERIAL);
                glPushMatrix();///頭
                    glTranslatef(0.08,0.16,0);
                    glRotatef(angle[0],0,0,1);
                    glTranslatef(0.05,0.08,0);
                    glmDraw(head2, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
                glPushMatrix();///頭
                    glTranslatef(-0.08,0.16,0);
                    glRotatef(angle[10],0,0,1);
                    glTranslatef(-0.05,0.08,0);
                    glmDraw(head3, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
            glPopMatrix();

            glPushMatrix();///右腳
                glScalef(0.3,0.3,0.3);
                glRotatef(180,0,1,0);
                glTranslatef(-0.4,-1.2,0);
                glRotatef(angle[11],1,0,0);
                glTranslatef(0,-1,0.25);
                glmDraw(right4, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
            glPushMatrix();///左腳
                glScalef(0.3,0.3,0.3);
                glRotatef(180,0,1,0);
                glTranslatef(0.4,-1.2,0);
                glRotatef(angle[12],1,0,0);
                glTranslatef(0,-1,0.25);
                glmDraw(left4, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();

        glPopMatrix();///還原矩陣

    glPopMatrix();
    glutSwapBuffers();
}
void motion(int x, int y)
{

    angle[now] -=(x-oldX);
    oldX=x; ///新座標記錄
    glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
    oldX=x;
    ///先給他有記憶之前的座標在哪
}

const GLfloat light_ambient2[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse2[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular2[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position2[] = { 0.3f, 4.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, 4.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("05160710_Robot");
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);

    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_ambient2);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse2);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular2);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position2);

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

沒有留言:

張貼留言