顯示具有 week14 標籤的文章。 顯示所有文章
顯示具有 week14 標籤的文章。 顯示所有文章

2019年5月30日 星期四

ˊ_>ˋHW4_機器人作業

ˊ_>ˋ遲交一個禮拜的作業
僅此紀念Q_Q



心得:
建模型建了大概5-6次,因為不熟=_=
還好有做出來ˊ_>ˋ

2019年5月23日 星期四

ˊ_>ˋ_week14

(1)主題:計時器Timer

#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
#include <stdio.h>///printf()
float angle = 0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
 
}
void timer(int t)///NOW timer!!!!
{
    glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
   /// printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
   /// PlaySoundA("mi.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!

}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("week14");

    glutDisplayFunc(display);

    glutMainLoop();}


-------------------------------------------------------------------------------------------
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0,0,1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);///NOW timer!!!!

    glutMainLoop();

}

(2)主題:內插公式






(3)主題:動畫

#include <GL/glut.h>

#include <mmsystem.h>///Now (1)

float angle=0;

float nowX=0;///NOW2

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();

        ///glRotatef(angle, 0,0,1);

        glTranslatef(nowX, 0, 0);///NOW2

        glutSolidTeapot( 0.3 );

    glPopMatrix();

    glutSwapBuffers();

}

void timer(int t)///NOW timer!!!!

{

    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps

    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘

    float alpha = (t%33) / 33.0;///NOW2 alpha 內插

    nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2


    angle += 1;

    glutPostRedisplay();///系統重繪畫面

}

int main(int argc, char**argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

    glutInitWindowSize(500,500);///變大了

    glutCreateWindow("week 14 timer");


    glutDisplayFunc(display);

    glutTimerFunc(1000, timer, 0);///NOW timer!!!!


    glutMainLoop();

}

















-->把反藍的文件放到我們的專案檔裡,以後就可以這樣打包使用了












用notepad++打開,改裡面Working dir,把雙引號內容改成 "."








嗶啵啵嗶啵2019/0523_W14

Week14

(1)主題:計時器
(2)主題:內差公式
(3)主題:動畫
(4)期末作品

-----------------------------------------------------------------------------------------------------
🙊1.一樣開啟glut專案、先匯出一個視窗大的大茶壺
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutSolidTeapot( 0.3 );

    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutMainLoop();
}




[2].到 http://billor.chsh.chc.edu.tw/sound/rain.htm 尋找一個喜歡的音檔!
把音檔放載freeglut>bin底下




[3].加入音檔的程式碼
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
#include <stdio.h>///printf()
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
    PlaySoundA("bubbs.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}




[4].讓他自行轉動
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle, 0,0,1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}


[6].滑鼠按一下就開始動
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
float nowX=0;///NOW2
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        ///glRotatef(angle, 0,0,1);
        glTranslatef(nowX, 0, 0);///NOW2
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    float alpha = (t%33) / 33.0;///NOW2 alpha 內插
    nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2

    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(1000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}


瞎78打-11

( 1 ) 主題 : 計時器 Timer
( 2 ) 主題 : 內差公式
( 3 ) 主題 : 動畫
( 4 ) 期末作品
--------------------------------------------------------------------------

每秒發一次聲音

#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
#include <stdio.h>///printf()
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
    PlaySoundA("fart.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}

每秒轉一次角度


void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}

內插法:

  excel  =  B2*96+(1-B2)*73

 程式套用內插法移動

float angle=0;
float nowX=0;///NOW2
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(nowX, 0, 0);///NOW2
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    float alpha = (t%33) / 33.0;///NOW2 alpha 內插
    nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2

    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}

Week14 鍾嘉穎 2019-05-23

1. 主題: 計時器 Timer (聲音、旋轉)
      1. 先載入freeglut (跟第一週一樣)
           1. Google search "freeglut windows"
           2. 從Transmission Zero 下載 "freeglut 3.0.0 MinGW Package"
           3. 解壓縮後放到桌面
           4. 在lib複製一個"libfreeglut.a"命名為"libglut32.a"
           5. CodeBlocks 開
           6. File  ->  New -> Project -> GLUT Project
           7. 把location改成"C:\Users\user\Desktop\freeglut"

      2. 加入程式碼

      3. 先做一個茶壺
           #include <GL/glut.h>
           void display()
           {
               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
               glutSolidTeapot( 0.3 );
               glutSwapBuffers();
           }
           int main(int argc, char**argv)
           {
               glutInit(&argc, argv);
               glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
               ///glutInitWindowSize(500,500);///可以開大一點的window
               glutCreateWindow("Week 14 Timer");

               glutDisplayFunc(display);

               glutMainLoop();
           }

           


     4. 下載一個wav檔

     5. 把wav檔放在 freeglut 的 bin 資料夾裡
           

     6. 先把聲音放進去  他會跟著 timer 裡的變數跑(多少秒會跑一次)
               #include <GL/glut.h>
               #include <mmsystem.h>///Now (1)
               void display()
               {
                   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                   glutSolidTeapot( 0.3 );
                   glutSwapBuffers();
               }
               void timer(int t)///NOW timer!!!!
               {
                   PlaySoundA("duck.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
               }
               int main(int argc, char**argv)
               {
                   glutInit(&argc, argv);
                   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
                   glutInitWindowSize(500,500);///變大了
                   glutCreateWindow("week 14 Timer");

                   glutDisplayFunc(display);
                   glutTimerFunc(1000, timer, 0);///NOW timer!!!! 1秒=1000   2秒=2000等等

                   glutMainLoop();
               }

           

     7. 設定一個函式 讓他隔1秒響一次 (還有一個變數t 記錄秒數)
               #include <GL/glut.h>
               #include <mmsystem.h>///Now (1)
               #include <stdio.h>///printf()
               void display()
               {
                   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                   glutSolidTeapot( 0.3 );
                   glutSwapBuffers();
               }
               void timer(int t)///NOW timer!!!!
               {
                   glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
                   printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
                   PlaySoundA("duck.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
               }
               int main(int argc, char**argv)
               {
                   glutInit(&argc, argv);
                   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
                   glutInitWindowSize(500,500);///變大了
                   glutCreateWindow("week 14 timer");

                   glutDisplayFunc(display);
                   glutTimerFunc(1000, timer, 0);///NOW timer!!!!

                   glutMainLoop();
               }

           

     8. 用 timer 做旋轉 (把聲音的函式改成旋轉的函式)
               #include <GL/glut.h>
               #include <mmsystem.h>///Now (1)
               float angle=0;
               void display()
               {
                   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                   glPushMatrix();
                       glRotatef(angle, 0,0,1);
                       glutSolidTeapot( 0.3 );
                   glPopMatrix();
                   glutSwapBuffers();
               }
               void timer(int t)///NOW timer!!!!
               {
                   /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
                   glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
                   angle += 1;
                   glutPostRedisplay();///系統重繪畫面
               }
               int main(int argc, char**argv)
               {
                   glutInit(&argc, argv);
                   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
                   glutInitWindowSize(500,500);///變大了
                   glutCreateWindow("week 14 Timer");

                   glutDisplayFunc(display);
                   glutTimerFunc(3000, timer, 0);///NOW timer!!!!

                   glutMainLoop();
               }
               


2. 主題: 內插公式
     1. 用Excel來試內插公式
               內插公式: ans = alpha * future + (1-alpha) *old
               alpha = 你有幾個fps 就是 現在的 fps/總共fps
               


     2. 把內插公式放到程式
               #include <GL/glut.h>
               #include <mmsystem.h>///Now (1)
               float angle=0;
               float nowX=0;///NOW2
               void display()
               {
                   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                   glPushMatrix();
                       ///glRotatef(angle, 0,0,1);
                       glTranslatef(nowX, 0, 0);///NOW2
                       glutSolidTeapot( 0.3 );
                   glPopMatrix();
                   glutSwapBuffers();
               }
               void timer(int t)///NOW timer!!!!
               {
                   /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
                   glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
                   float alpha = (t%33) / 33.0;///NOW2 alpha 內插
                   nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2

                   angle += 1;
                   glutPostRedisplay();///系統重繪畫面
               }
               int main(int argc, char**argv)
               {
                   glutInit(&argc, argv);
                   glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
                   glutInitWindowSize(500,500);///變大了
                   glutCreateWindow("week 14 timer");

                   glutDisplayFunc(display);
                   glutTimerFunc(1000, timer, 0);///NOW timer!!!!

                   glutMainLoop();
               }

               

     
3. 主題: 動畫
      1. 把自己的摸型讀入
      2. 按W能存動作
      3. 按R能讀動作
      4. 加內插公式
      6. 做成動畫

4. 期末作品
      

書樑的上課筆記 w14

電腦圖學week14
1.主題:計時器Timer
步驟:
(1)打開codeblocks並建立一個新的project GLUT
(2)打入以下程式碼

程式碼:
#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
#include <stdio.h>///printf()
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    glutTimerFunc(1000, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    printf("timer(t) 的 t是 %d\n", t);///順便印一下現在的t是多少
    PlaySoundA("Birds.wav", NULL, SND_ASYNC);///Now (2) ///NOW timer!!!!
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(3000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}

(3)輸入後執行即可

2.主題:內插公式

步驟:
(1)打開codeblocks並建立一個新的project GLUT
(2)打入以下程式碼

#include <GL/glut.h>
#include <mmsystem.h>///Now (1)
float angle=0;
float nowX=0;///NOW2
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        ///glRotatef(angle, 0,0,1);
        glTranslatef(nowX, 0, 0);///NOW2
        glutSolidTeapot( 0.3 );
    glPopMatrix();
    glutSwapBuffers();
}
void timer(int t)///NOW timer!!!!
{
    /// 1000 ms = 1 sec,  30 ms = 1/33 sec , 33 fps
    glutTimerFunc(30, timer, t+1 );///NOW timer!!!! 起床要播下一個鬧鐘
    float alpha = (t%33) / 33.0;///NOW2 alpha 內插
    nowX = alpha* 1 + (1-alpha)* -1 ;///NOW2

    angle += 1;
    glutPostRedisplay();///系統重繪畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500,500);///變大了
    glutCreateWindow("week 14 timer");

    glutDisplayFunc(display);
    glutTimerFunc(1000, timer, 0);///NOW timer!!!!

    glutMainLoop();
}

(3) 執行後即可

3.主題:動畫

程式碼:
#include <stdio.h>///NOW for fprintf()
#include <GL/glut.h>
#include "glm.h"

FILE * fout = NULL;///NOW for fprintf()
FILE * fin = NULL;///NOW for fscanf()

GLMmodel* pmodel = NULL;
GLMmodel* pmodel2 = NULL;
GLMmodel* pmodel21 = NULL;
GLMmodel* pmodel3 = NULL;
GLMmodel* pmodel31 = NULL;
GLMmodel* pmodel4 = NULL;
GLMmodel* pmodel41 = NULL;
GLMmodel* pmodel5 = NULL;
GLMmodel* pmodel51 = NULL;

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

float oldAngle[20];///NOW4
float newAngle[20];///NOW4
float angle[20];
int angleID=1;

void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    ///身體
    glPushMatrix();
        glTranslatef(0, 0.3,0 );
        glScalef(0.5,0.5,0.5);

            if (!pmodel) {
                pmodel = glmReadOBJ("data/06160451.obj");
            if (!pmodel) exit(0);
                glmUnitize(pmodel);
                glmFacetNormals(pmodel);
                glmVertexNormals(pmodel, 90.0);
            }
        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
        ///右上臂
        glPushMatrix();
            glTranslatef(0.45,0.3,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[1], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);

            glPushMatrix();
            glTranslatef(0,-1.1,0 );
            glScalef(1,1,1);
            glRotatef(angle[2], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();
        glPushMatrix();
            glTranslatef(-0.45,0.3,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[3], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);

            glPushMatrix();
            glTranslatef(0,-1.1,0 );
            glScalef(1,1,1);
            glRotatef(angle[4], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
            glPopMatrix();
        glPopMatrix();

        glPushMatrix();
            glTranslatef(0.2,-1.05,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[5], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);


            glPushMatrix();
                glTranslatef(0,-1.2,0 );
                glScalef(1,1,1);
                glRotatef(angle[6], 0,0,1);
                glTranslatef(0,-0.7, 0);
                if (!pmodel2) {
                    pmodel2 = glmReadOBJ("data/123.obj");
                    if (!pmodel2) exit(0);
                    glmUnitize(pmodel2);
                    glmFacetNormals(pmodel2);
                    glmVertexNormals(pmodel2, 90.0);
                }
                glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
            glPopMatrix();

        glPushMatrix();
            glTranslatef(-0.2,-1.05,0 );
            glScalef(0.5,0.5,0.5);
            glRotatef(angle[7], 0,0,1);
            glTranslatef(0,-0.7, 0);
            if (!pmodel2) {
                pmodel2 = glmReadOBJ("data/123.obj");
            if (!pmodel2) exit(0);
                glmUnitize(pmodel2);
                glmFacetNormals(pmodel2);
                glmVertexNormals(pmodel2, 90.0);
            }
            glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);


            glPushMatrix();
                glTranslatef(0,-1.2,0 );
                glScalef(1,1,1);
                glRotatef(angle[8], 0,0,1);
                glTranslatef(0,-0.7, 0);
                if (!pmodel2) {
                    pmodel2 = glmReadOBJ("data/123.obj");
                    if (!pmodel2) exit(0);
                    glmUnitize(pmodel2);
                    glmFacetNormals(pmodel2);
                    glmVertexNormals(pmodel2, 90.0);
                }
                glmDraw(pmodel2, GLM_SMOOTH | GLM_MATERIAL);
                glPopMatrix();
            glPopMatrix();

    glPopMatrix();

    glutSwapBuffers();
}
int oldX=0;
void mouse(int button, int state, int x, int y)///NOW2
{
    oldX = x;
}
#include <stdio.h>
void motion(int x, int y)
{
    angle[angleID] += x-oldX;
    oldX = x;
    for(int i=0;i<20;i++){
    printf(" %.2f ", angle[i]);
    }
    printf("\n");
    display();
    ///motion裡面,就不要再存檔了.... (第13週一直存,但現在不要存,才不會亂亂的)
}

void timer(int t)///NOW4
{///NOW4
    glutTimerFunc(33, timer, t+1);///NOW4 變快了... 撥好下一個timer的時間.... 等一下它會醒來
    if(t%30==0){///關鍵的時間 每過1秒,讀新的 ///NOW4
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW4
        for(int i=0; i<20; i++){///NOW4
            oldAngle[i] = newAngle[i];///NOW4 原本的新的,就變舊的
            fscanf(fin, "%f", &newAngle[i]);///NOW4 再從檔案,讀入新的
        }///NOW2
    }
    float alpha= (t%30)/30.0;///NOW4 算出alpha值 0.0 ... 1.0
    for(int i=0; i<20; i++){///NOW4 20個關節角度
        angle[i] = alpha * newAngle[i] + (1-alpha) * oldAngle[i];///NOW4 都要做內插
    }
    glutPostRedisplay();///NOW4 重畫畫面
}
void keyboard(unsigned char key, int x, int y)
{
    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=='w'){///只有按下'w'才存1組動作 (1行)
        if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW
        for(int i=0; i<20; i++){///NOW
            fprintf(fout, " %.1f ", angle[i]);///NOW
        }///NOW
        fprintf(fout, "\n");///NOW
    }///NOW
    if(key=='r'){///NOW2
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW2
        for(int i=0; i<20; i++){///NOW2
            fscanf(fin, "%f", &angle[i]);///NOW2
        }///NOW2
    }
    if(key=='p' || key=='t'){///NOW3 Play!!!!!!! timer 叫起來
        glutTimerFunc(500, timer, 0);///NOW3 撥好第1個timer的時間.... 等一下它會醒來
        if(fin==NULL) fin=fopen("motion.txt", "r");///NOW3
        for(int i=0; i<20; i++){///NOW3
            fscanf(fin, "%f", &newAngle[i]);///NOW4
        }///NOW2
    }
    glutPostRedisplay();///NOW2 重畫畫面
}

int main(int argc,char**argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week06");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glClearColor(1,1,1,1);
    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);
    glutKeyboardFunc(keyboard);///NOW3
    glutMouseFunc(mouse);///NOW2
    glutMotionFunc(motion);///NOW2
    glutDisplayFunc(display);

    glutMainLoop();

}

4.期末作品