2019年5月23日 星期四

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. 期末作品
      

沒有留言:

張貼留言