2018年6月30日 星期六

Week17 期末作品展示

期末作品展示

YOUTUBE:
https://www.youtube.com/watch?v=WK3Q2XUQIzU&feature=youtu.be

程式碼:
#include <GL/glut.h>
#include "glm.h"
#include <stdio.h>
#include <mmsystem.h>
GLMmodel * pmodel0=NULL;
GLMmodel * pmodel1=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;
GLMmodel * pmodel12=NULL;
GLMmodel * pmodel13=NULL;
GLMmodel * pmodel14=NULL;
GLMmodel * pmodel15=NULL;
///float angle=0;
FILE * fout=NULL;
FILE * fin=NULL;
float angle[25],angleNew[25],angleOld[25],oldX,oldY;
int now=0;///Now5:用keyboard的數字鍵,來切換關節
GLUquadric * quad;
GLuint id;
void timer(int t)
{
    glutTimerFunc(100,timer,t+1);
    if(t%10==0)
    {
        for(int i=0;i<25;i++)
        {
            angleOld[i] =angleNew[i];
            fscanf(fin,"%f",&angleNew[i]);
        }
    }
    float alpha=(t%10)/10.0;
    for(int i=0;i<25;i++)
    {
        angle[i]=alpha*angleNew[i]+(1-alpha)*angleOld[i];
    }
    glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key=='0') now=0;
    if(key=='1') now=1;
    if(key=='2') now=2;///Now5:用keyboard的數字鍵,來切換關節
    if(key=='3') now=3;
    if(key=='4') now=4;
    if(key=='5') now=5;
    if(key=='6') now=6;
    if(key=='7') now=7;
    if(key=='8') now=8;
    if(key=='9') now=9;
    if(key=='a') now=10;
    if(key=='b') now=11;
    if(key=='c') now=12;
    if(key=='d') now=13;
    if(key=='e') now=14;
    if(key=='f') now=15;
    if(key=='g') now=16;
    if(key=='h') now=17;
    if(key=='i') now=18;
    if(key=='j') now=19;
    if(key=='k') now=20;
    if(key=='l') now=21;
    if(key=='m') now=22;
    if(key=='s' || key=='S' || key=='w' || key=='W')
    {
        if(fout==NULL) fout=fopen("output.txt", "w+");
        for(int i=0; i<25; i++) ///Now5: for迴圈
        {
            printf("%.3f ", angle[i]);///Now5:  把每一個陣列裡的角度,都寫一次
            fprintf(fout, "%.3f ", angle[i]);///Now5:  把每一個陣列裡的角度,都寫一次
        }///Now5: 小心,寫檔 vs. 讀檔,要完全一樣
        printf("\n");///Now5: 最後要印個跳行,才不會畫面亂掉
        fprintf(fout,"\n");///Now5: 最後要印個跳行,才不會畫面亂掉
    }///3個角度的值,印到檔案去
    if(key=='r' || key=='R') ///Now4:
    {
        if(fin==NULL) fin=fopen("output.txt", "r");///Now4: 第一次讀檔時,要先開檔
        for(int i=0; i<25; i++) ///Now5: for迴圈
        {
            fscanf(fin, "%f ", &angle[i]);///Now5:  把每一個陣列裡的角度,都讀一次
            printf("%f ", angle[i]);///Now5:  順便印一下
        }///Now5: 小心,寫檔 vs. 讀檔,要完全一樣
        printf("\n");///Now5: 最後要印個跳行,才不會畫面亂掉
    }
    if(key=='p'||key=='P')
    {
        if(fin==NULL) fin=fopen("output.txt","r");
        for(int i=0;i<25;i++)
        {
            fscanf(fin, "%f ",&angleNew[i]);
        }
        glutTimerFunc(100,timer,0);
    }
    glutPostRedisplay();///Now4: 重畫畫面
}
void motion(int x, int y)///Now:
{
    ///Now:
    angle[now] +=(x-oldX);
    oldX =x ;
    ///Now: 角度會隨mouse motion而改值///Now5:用keyboard的數字鍵,來切換關節
    ///Now5: 下面真的都刪掉了, 臨時的啦 Now2: 這個等一下會刪掉
    glutPostRedisplay();///Now:
}///Now:
void mouse(int button,int state,int x,int y)
{
    oldX=x; oldY=y;
}

/*void motion(int x, int y)
{
    angle=x; glutPostRedisplay();
}*/
/*void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///Now: 要畫東西
    glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
        glutSolidTeapot(0.3);///Now:身體
        glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
            glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
            glRotatef(angle[1], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
            glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
            glutSolidTeapot(0.3); ///Now:右手臂
            glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
                glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
                glRotatef(angle[2], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
                glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
                glutSolidTeapot(0.3); ///Now:右肘
            glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
        glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
        glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
            glTranslatef(-0.4, 0, 0);///Now:(3) 掛在右邊
            glRotatef(angle[3], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
            glTranslatef(-0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
            glutSolidTeapot(0.3); ///Now:右手臂
            glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
                glTranslatef(-0.4, 0, 0);///Now:(3) 掛在右邊
                glRotatef(angle[4], 0,0,1);///Now:(2) angle的轉動角度,對Z軸
                glTranslatef(-0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
                glutSolidTeapot(0.3); ///Now:右肘
            glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
        glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
    glutSwapBuffers();
}*/

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (!pmodel0)
    {
        pmodel0 = glmReadOBJ("data/body.obj");
        if (!pmodel0) exit(0);
        glmUnitize(pmodel0);
        glmFacetNormals(pmodel0);
        glmVertexNormals(pmodel0, 90.0);
    }
    if (!pmodel1)
    {
        pmodel1 = glmReadOBJ("data/H.obj");
        if (!pmodel1) exit(0);
        glmUnitize(pmodel1);
        glmFacetNormals(pmodel1);
        glmVertexNormals(pmodel1, 90.0);
    }
    if (!pmodel2)
    {
        pmodel2 = glmReadOBJ("data/R_arm.obj");
        if (!pmodel2) exit(0);
        glmUnitize(pmodel2);
        glmFacetNormals(pmodel2);
        glmVertexNormals(pmodel2, 90.0);
    }
    if (!pmodel3)
    {
        pmodel3 = glmReadOBJ("data/R_arm_A.obj");
        if (!pmodel3) exit(0);
        glmUnitize(pmodel3);
        glmFacetNormals(pmodel3);
        glmVertexNormals(pmodel3, 90.0);
    }
    if (!pmodel4)
    {
        pmodel4 = glmReadOBJ("data/R_head.obj");
        if (!pmodel4) exit(0);
        glmUnitize(pmodel4);
        glmFacetNormals(pmodel4);
        glmVertexNormals(pmodel4, 90.0);
    }
    if (!pmodel5)
    {
        pmodel5 = glmReadOBJ("data/L_arm.obj");
        if (!pmodel5) exit(0);
        glmUnitize(pmodel5);
        glmFacetNormals(pmodel5);
        glmVertexNormals(pmodel5, 90.0);
    }
    if (!pmodel6)
    {
        pmodel6 = glmReadOBJ("data/L_arm_A.obj");
        if (!pmodel6) exit(0);
        glmUnitize(pmodel6);
        glmFacetNormals(pmodel6);
        glmVertexNormals(pmodel6, 90.0);
    }
    if (!pmodel7)
    {
        pmodel7 = glmReadOBJ("data/L_head.obj");
        if (!pmodel7) exit(0);
        glmUnitize(pmodel7);
        glmFacetNormals(pmodel7);
        glmVertexNormals(pmodel7, 90.0);
    }
    if (!pmodel8)
    {
        pmodel8 = glmReadOBJ("data/R_Leg.obj");
        if (!pmodel8) exit(0);
        glmUnitize(pmodel8);
        glmFacetNormals(pmodel8);
        glmVertexNormals(pmodel8, 90.0);
    }
    if (!pmodel9)
    {
        pmodel9 = glmReadOBJ("data/R_Leg_L.obj");
        if (!pmodel9) exit(0);
        glmUnitize(pmodel9);
        glmFacetNormals(pmodel9);
        glmVertexNormals(pmodel9, 90.0);
    }
    if (!pmodel10)
    {
        pmodel10 = glmReadOBJ("data/R_Leg_F.obj");
        if (!pmodel10) exit(0);
        glmUnitize(pmodel10);
        glmFacetNormals(pmodel10);
        glmVertexNormals(pmodel10, 90.0);
    }

    if (!pmodel11)
    {
        pmodel11 = glmReadOBJ("data/L_Leg.obj");
        if (!pmodel11) exit(0);
        glmUnitize(pmodel11);
        glmFacetNormals(pmodel11);
        glmVertexNormals(pmodel11, 90.0);
    }
    if (!pmodel12)
    {
        pmodel12 = glmReadOBJ("data/L_Leg_L.obj");
        if (!pmodel12) exit(0);
        glmUnitize(pmodel12);
        glmFacetNormals(pmodel12);
        glmVertexNormals(pmodel12, 90.0);
    }
    if (!pmodel13)
    {
        pmodel13 = glmReadOBJ("data/L_Leg_F.obj");
        if (!pmodel13) exit(0);
        glmUnitize(pmodel13);
        glmFacetNormals(pmodel13);
        glmVertexNormals(pmodel13, 90.0);
    }
     if (!pmodel14)
    {
        pmodel14 = glmReadOBJ("data/A.obj");
        if (!pmodel14) exit(0);
        glmUnitize(pmodel14);
        glmFacetNormals(pmodel14);
        glmVertexNormals(pmodel14, 90.0);
    }
     if (!pmodel15)
    {
        pmodel15 = glmReadOBJ("data/JJ.obj");
        if (!pmodel15) exit(0);
        glmUnitize(pmodel15);
        glmFacetNormals(pmodel15);
        glmVertexNormals(pmodel15, 90.0);
    }
    glPushMatrix();///身體
        glTranslatef(angle[1]/500,0,0);
        glTranslatef(angle[2]/500,0,0);
        glRotatef(angle[3],0,1,0);
        glRotatef(90,0,1,0);
        glScaled(0.35,0.35,0.35);
        glmDraw(pmodel0, GLM_SMOOTH | GLM_MATERIAL);
    glPushMatrix();///右臂
        glTranslatef(-0.04,0,-0.8);
        glRotatef(angle[6],0,0,1);
        glTranslatef(0.52,0,0);
        glRotatef(180,0,0,1);
        glScaled(1.7,1.7,1.7);
        glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
        glPushMatrix();///右肘
            glTranslatef(-0.3,0,0.05);
            glRotatef(angle[7],0,0,1);
            glTranslatef(-0.27,0,0);
            glScaled(1,1,1);
            glmDraw(pmodel3, GLM_SMOOTH | GLM_MATERIAL);
            glPushMatrix();///右腕
                glTranslatef(-0.33,-0.01,-0.05);
                glRotatef(angle[8],0,0,1);
                glTranslatef(-0.06,0,0);
                glRotatef(180,0,0,1);
                glScaled(1,1,1);
                glmDraw(pmodel4, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();///左臂
        glTranslatef(0, 0, 0.83);
        glRotatef(angle[9], 0,0,1);
        glTranslatef(0.53, 0, 0);
        glRotatef(180,0,0,1);
        glScaled(1.55,1.55,1.55);
        glmDraw(pmodel5, GLM_SMOOTH | GLM_MATERIAL);
        glPushMatrix();///左肘
            glTranslatef(-0.36,0,-0.05);
            glRotatef(angle[10],0,0,1);
            glTranslatef(-0.28,0,0);
            glScaled(1.2,1.2,1.2);
            glmDraw(pmodel6, GLM_SMOOTH | GLM_MATERIAL);
            glPushMatrix();///左腕
                glTranslatef(-0.31,-0.01,0.05);
                glRotatef(angle[11],0,0,1);
                glTranslatef(-0.06,0,0);
                glRotatef(180,0,0,1);
                glScaled(1,1,1);
                glmDraw(pmodel7, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();///右大腿
        glTranslatef(-0.2,-0.7,-0.3);
        glRotatef(angle[12],0,0,1);
        glTranslatef(0,-0.3,0);
        glScaled(0.4,0.4,0.4);
        glmDraw(pmodel8, GLM_SMOOTH | GLM_MATERIAL);
        glPushMatrix();///右小腿
            glTranslatef(0.3,-0.6,0);
            glRotatef(angle[13],0,0,1);
            glTranslatef(-0.3,-0.8,0);
            glScaled(3,3,3);
            glmDraw(pmodel9, GLM_SMOOTH | GLM_MATERIAL);
            glPushMatrix();///右腳掌
                glTranslatef(0,-0.32,0);
                glRotatef(angle[14],0,0,1);
                glTranslatef(0.23,0,0);
                glScaled(1.5,1.5,1.5);
                glmDraw(pmodel10, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();///左大腿
        glTranslatef(-0.2,-0.71,0.3);
        glRotatef(angle[15],0,0,1);
        glTranslatef(0,-0.3,0);
        glScaled(0.95,0.95,0.95);
        glmDraw(pmodel11, GLM_SMOOTH | GLM_MATERIAL);
        glPushMatrix();///左小腿
            glTranslatef(-0.01,-0.15,0);
            glRotatef(angle[16],0,0,1);
            glTranslatef(0,-0.4,0);
            glScaled(2.3,2.3,2.3);
            glmDraw(pmodel12, GLM_SMOOTH | GLM_MATERIAL);
            glPushMatrix();///左腳掌
                glTranslatef(-0.04,-0.18,0);
                glRotatef(angle[17],0,0,1);
                glTranslatef(0.17,0,0);
                glScaled(0.56,0.56,0.56);
                glmDraw(pmodel13, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
    glPopMatrix();
    glPushMatrix();///頭
    glTranslated(0,0.54,0);
    glRotatef(angle[5],0,1,0);
    glRotatef(angle[4],1,0,0);
    glScaled(1.15,1.15,1.15);
    glmDraw(pmodel1, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();

    glPopMatrix();
    glPushMatrix();///帽子
        glTranslatef(angle[18]/1000,0,0);
        glTranslatef(0,angle[19]/1000,0);
        glTranslatef(0.5,-0.45,0);
        glScaled(1.2,1.3,1.2);
        glmDraw(pmodel14, GLM_SMOOTH | GLM_MATERIAL);
    glPopMatrix();
    glPushMatrix();///拐杖
        glTranslatef(angle[20]/1000,0,0);
        glTranslatef(0,angle[21]/1000,0);
        glTranslatef(0.73,-0.06,0);
        glRotatef(angle[22],0,0,1);
        glTranslatef(0,-0.3,0);
        glScaled(1.4,1.5,1.4);
        glmDraw(pmodel15, GLM_SMOOTH | GLM_MATERIAL);
    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("Play With Fire.wav",NULL,SND_ASYNC);
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("05161074");
    glutDisplayFunc(display);
    glClearColor(1,1,1,1);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    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_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;
}

沒有留言:

張貼留言