2022年5月31日 星期二

ʕ •ᴥ•ʔ week15

 

week15 20220531
小葉老師上課要點:
1. 播聲音、播MP3
2. 播放動畫、內插
3. 機器人擺動作、跳舞





主題: PlaySound() 播聲音


1. 開啟 codeblocks 建立一個新檔(File > New > Empty File) : week15-1_PlaySound.cpp

2. 上週使用 #include <mmsystem.h>

    本週使用 #include <windows.h> 
    PlaySound( "檔名.wav" , NULL , SND_ASYNC);  //不等待/不同步
    PlaySound( "檔名.wav" , NULL , SND_SYNC);  //等待/同步

3. 要注意工作執行目錄 working_dir (in C:\....)

4. 要成功播出聲音,要加入咒語wimnn : 
    * 設定咒語步驟複習:
    1. Settings > Compiler

    2. Linker settings > Add > 輸入:winmm


    3. 按綠色三角行加齒輪執行 :
        *程式音檔不存在,所以出現的聲音是 window 內建的錯誤提示聲


    4
. 在 codeblocks 下方的 Build log 裡確定工作目錄位置後,將正確音檔放進這個目錄,就會正常
        播放聲音了


    *我放了鵝叫聲的音檔在工作目錄裡 ,音檔一定要是 .wav 檔 (PlaySound() 只能播 wav檔)


主題: PlaySound() 更多參數


1. 開啟 codeblocks 建立一個新檔(File > New > Empty File): 
    week15-2_SND_SYNC_SND_ASYNC.cpp

    *PlaySound( "檔名.wav" , NULL , SND_ASYNC);  //不等待/不同步
      > 如果沒有迴圈控制,程式會直接執行到最後一行。
         有迴圈控制,可以不播完,再背景播,繼續做下一個指令 ,適合做互動

    *PlaySound( "檔名.wav" , NULL , SND_SYNC);  //等待/同步
     > 會把這一行音檔播完,等到天荒地老才會執行下一行,不適合做互動

2. 將 do.wav , re.wav, mi.wav 三個音檔放入目錄資料夾,用 SYNC (等待),會完整播完 do , re , mi 音檔


3. 使用 ASYNC (不等待) + 迴圈控制 : 達到互動效果
    * 一開始播鵝叫聲,按數字1: do ;數字2: re ; 數字3: mi



主題:  PlaySound() 播 mp3


*     wav                v.s                MP3 
     檔案大                                  檔案小            
    原始檔案                             壓縮過檔案
  40年前就有                           20年前出現  
簡單:程式碼只要一行           複雜:要用較多行程式碼

PlaySound()只要一行使用 wav 即可播聲音

到 moodle 下載 CMP3_MCI.h 這個檔可以在 #include "CMP3_MCI.h" 後, 解鎖 mp3.Play()功能

** wav 檔案不可以直接改檔名為 mp3 ,因為將兩個音檔用notepad++開啟看程式碼,
會發現兩個檔案內容根本不一樣,所以不可以騙人不能這麼做

1. 開啟 codeblocks 建立一個新檔(File > New > Empty File> : week15-3_mp3.cpp

2. 在 moodle 下載 CMP_mci.h ,下載要播的 mp3 音檔,放在同目錄

3.標頭檔 #include "CMP3_MCI.h"
   宣告 CMP3_MCI mp3;
   mp3.Load("檔名.mp3");
   mp3.Play();


主題:  關節、做動畫


1. 開啟 codeblocks 建新的 GLUT 專案 : week15_angles_TRT_again 
    從上一個程式( week14_angle_fprintf_fscanf  ) 做修改關節 ,最後長按 ' r ' 會讀入資料做出
    原本擺過的動作

2. 但是以上原本的程式很不像動畫執行的很慢 
    原因 : 每拉一個關節 myWrite() 就寫一行 ,myRead 會讀一行

    解決 : 不要把 myWrite() 放 motion() ,就不會有拉一個關節就紀錄導致動畫又慢又卡的問題
              把一個動作對應的關節全部調好後,再紀錄 myWrite (一行)動作

3. 把原 motion() 函式內的 myWrite(); 註解掉
    在 keyboard 函式 新增 if (key=='s') myWrite(); ///調好動作,再save存檔


4. 但是目前我只有8個動作,按8次 ' r ' 就結束動畫了。
    希望能夠一樣的動作重複多做幾次怎麼做呢 ?

   * 找到工作目錄開啟 " file.txt " ,會看到剛剛在小黑裡記錄的8行動作


   * 把原本的8個(行)動作複製起來,貼上看要重複幾次
     以下截圖複製貼上了8次,所以總共能夠按 72 次 ' r ' 做動作


   * 再回到 codeblock 再執行一次,就能夠按72次 ' r ' 重複動作了

主題: 機器人擺動作、跳舞

*我們甲班在講解這個部分有錄影檔壞掉,所以有參考乙班的上課內容
 
1. 開啟 codeblocks 建新的 GLUT 專案 : week15_homework_gundam_parts
    從上一個程式( week15_angles_TRT_again  ) 做修改

2. 寫一個新的 display() ,原本舊的 display()改為 displayOld() 
   再舊的偷兩行程式碼到新的
   

3. 將 glm.cpp , glm.h , data(裡面有五個檔案) 放入目錄資料夾


4. 回到 codeblocks 在左邊的專案,加入 Add glm.cpp

    * 在專案名稱上 按右鍵,選擇 Add files > 選擇專案目錄內的 glm.cpp > OK 



5. 開始寫程式碼讀入模型


6. 檢查工作目錄是否在奇怪偏僻的桌面上 freeglut 的 bin ,總之要把工作目錄設在專案資料夾
    *詳細圖解可參考 第14週 > 主題: 做動畫 > 2.奇怪的地方

   **更改工作執行目錄步驟:
   a. 使用 notepad++ 開啟目錄資料夾 (week15_homework_gundam_parts) 的 cbp 檔
    b. 找到cbp 檔內所有 working_dir  (在第11、21行)
        將原本的奇怪偏僻路徑改為一個小數點 <Option working_dir="." /> 改完記得存檔
   c. 回到 codeblcks 會被詢問 Reload Project? 選擇 Yes 
       被問是否存檔就給他存,在回去 notepad++看 working_dir 是否有改成功 
       沒成功就在重複上一個 b. 工作 
   d. 確認好之後按綠色三角加齒輪執行,出現錯誤,表示找不到 freeglut.dll
       往下面 Build log 確認工作執行目錄是否為在專案目錄了,沒有就回去在重新修正
   e. 到桌面上的 freeglut \ bin 裡的 freeglut 複製到專案目錄裡就好,不需重裝

7. 這個新的 display() 身體沒有分區塊,不要了,改為 displayNotParts()
    再準備一個最新的 display() ///最新的 display(),會把身體每一塊都分別處理好

8. 到 teams 下載老師的 Gundam.zip , 解壓縮後有很多切割好的模型,
    將26個切割的部位複製到專案目錄資料夾內的data資料夾 


9. 發明 myReadOne 函式用來把每個部位都讀進來,最新的 display()就可以簡短清爽的只使用
    一行程式碼就讀入一個部位,舊的display們就是示範以前讀入一個部位就要各自寫很多行 





沒有留言:

張貼留言

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...