2019年6月12日 星期三

ˊ_>ˋ_Week16

(1)作業專題:Q&A

第一個疑問: 貼圖參數glVertex3f(__, __, __)第三個參數更改成 0 or +1 or -1 模型與貼圖都沒辦法好好合在一起,不是貼圖消失,就是模型被蓋住。

老師回覆:猜測可能有兩個問題
(1) 你的程式裡,"沒有戴上正確度數的眼睛",也就是上課教的, Projection Matrix 沒有修正,就只會顯示 -1...+1的範圍,所以你的圖裡面, 背景的座標z寫 +1時,超過範圍就看不到,只剩下 3D model,我猜你把背景的 z 設成 +0.9 看看,可能會秀出來
(2) 圖裡面沒有秀模型的程式碼,有可能你的模型剛好介於 0到 +1中間,所以你背景在 0的時候剛好也擋到3D模型,你背景在-1時,也是剛好擋到3D模型

解決方法:
(1)glVertex3f(__, __, __)第三個數值設為0.9 -->正常運作

(2)把glVertex3f(__, __, __))第三個數值設為0
    並且在main內的MainLoop之前加上這四行
    glMatrixMode(GL_PROJECTION);    ///投影矩陣相關 戴好我們的正確度數眼鏡
    glLoadIdentity();               ///投影矩陣相關 戴好我們的正確度數眼鏡
    glOrtho(-1,+1,-1,+1,-100,+100); ///投影矩陣相關 戴好我們的正確度數眼鏡
    glMatrixMode(GL_MODELVIEW);     ///投影矩陣相關 切換回我們正確的矩陣
-->最後便可以正常運作




第二個疑問:
模型和貼圖一起出來的時候,模型顏色跑掉,即使打開obj檔裡,在usemtl前一行加上g ,也沒辦法轉回正常顏色。


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDisable(GL_LIGHTING);  ///新增的-解決辦法-先不要打光-讓貼圖的顏色是原本的顏色(沒有這行,就很像光源沒有正對螢幕,才導致暗暗的)
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, id1);///id1 for background
    glBegin(GL_POLYGON);
        glTexCoord2f(0, 0); glVertex3f(-1, +1, 0);
        glTexCoord2f(0, 1); glVertex3f(-1, -1, 0);
        glTexCoord2f(1, 1); glVertex3f(+1, -1, 0);
        glTexCoord2f(1, 0); glVertex3f(+1, +1, 0);
        ///問題說起來像是洗衣服,衣服被染色,所以顏色改變
    glEnd();
 
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);   ///新增的-解決辦法-這時候模型要出現前再打光,模型顏色就會對了

----------------------同學疑問-----------------------  


Q: 老師我要做機器人跳舞的作業請問這是什麼問題呢? 
Assertion failed: model, file C:\Users\user\Desktop\你的目錄\glm.cpp, line 1587


A: 這個訊息, 是 glm.cpp 第1587行噴出一個訊息, 說它無法確認 model是好的。請看附圖, 1587行是在 glmDraw()函式裡面, 你給的第一個參數 model 如果是 NULL, 就會讓 assert(model)那行出錯。而原因是因為你在之前 glmReadOBJ(...) 沒有成功把 3D Model OBJ檔讀好。





-------------背景圖把3D模型裁掉,怎麼把背景調後面一點呢---------------------
Q: 老師,我貼圖放上去變這樣(背景圖把3D模型裁掉了),能請問要怎麼把背景調後面一點呢?
A: 你程式的背景貼圖的座標, 是使用 glVertex2f(x,y) 所以它的z座標被設為0, 剛好會裁到你的3D 模型。


解決方法: 改用 glVertex3f(x, y, z) 其中 z的值, 可先試 -0.99 或 +0.99 試試看


---------------模型跑出來後除了顏色不一樣,也跟原本做的長不一樣--------------
Q: 老師不好意思這麼晚打擾,我的模型跑出來後除了顏色不一樣,也跟我原本做的長不一樣,是哪部份的問題?
A: (1) 顏色不一樣, 可能是 OBJ檔裡面有版本相容的錯誤, 這個我知道怎麼解, 但 glm.cpp 會用舊方式 解讀 新的 OBJ檔格式。解決方法是, 把 OBJ檔裡面 usemtl 項目全部檢查一次, 要確認每個 group g 都只有一個 usemtl 。如果有不合理的地方, 可手動將每個 usemtl 之前插入1行 g ooxx你自己決定許多不同的group名字。這樣就可以每個group使用一個 usemtl 來讓色彩變正確。
(2) 你的正面、背面 反過來了。不要 glEnable(GL_CULL_FACE) 應該可以解決

----------------------小黑窗跑出glmDraw() warning:-------------------------------
Q: 老師 我想請問為什麼我的小黑窗會一直跑 glmDraw() warning: material render mode requested with no materials devfined.
A: 小黑窗裡面的訊息, 看起來還好。它的意思是, 你的模型的 mtl檔裡, 沒有 obj檔裡需要的某個 material, 有可能是 Maya匯出時有錯誤造成的。不過還好, 是個小的 warning, 還是可以畫出來。

----------------motion問題----------------------

-----------------動作存不起來-----------------
Q: 老師,我想請教一下,動作存不起來有可能是因為哪些問題嗎? (原先是可以儲存動作在motion的, 但是剛剛突然都存不進去)
A: 可能的原因不少。如果確認之前可以做檔案write/read, 則我猜是 某次程式不正常結束, 結果 motion.txt 被某個 process 鎖住。重開機試試看。
註: 最後發現是防毒軟體 讓程式讀寫不正常。
-----------------------找不到motion.txt ----------------------
Q: 謝謝老師,我找到了 motion.txt 了,它存到freeglut>bin裡了,那我只要把它複製到0616xxxx的檔案夾就可以了嗎? 還是要更改程式嗎?
A: 不行! (a) 如果你只是把它複製到 專案的資料夾中, 可能還是無法運作。 (b) 程式碼沒有錯, 所以也不是更改程式碼。
正確的作法, 是把上課時老師教你們使用 Notepad++ 把 CodeBlocks Project 專案檔 (0616xxxx.cbp檔) 開啟修改: 先關閉CodeBlocks, 手動把 working_dir 設成 小數點 . 表示現在所在目錄。這樣重開CodeBlocks之後, 就會以你的專案目錄來讀寫檔案了。 也請記得 freeglut.dll 檔也要放一份在你的專案目錄裡
這個問題是有歷史典故的: GLUT專案, 需要對應的 dll檔案, 所以 CodeBlocks在新增專案時, 就取巧一下, 把 GLUT目錄裡的 bin 當成是 working_dir 目錄, 這樣就可免複製 dll 檔, 直接執行就可讓你看到執行的結果。
但通常 working目錄應該在專案目錄裡, 所以你設定好後, 自己copy dll 檔即可

---------------------沒有跑出motion.txt檔------------------------
Q: 老師不好意思,我想問為什麼我按了w但是沒有跑出motion.txt檔
A: 看你的程式碼, 按了 w 是會真的把 motion.txt產生出來。所以有可能你搞錯working執行目錄了。你可以觀察 CodeBlocks在執行時, 下面會秀出 (int C:\...你的 working目錄 ), 而檔案會在那個目錄裡生出來。
-----------------------motion一多以後就沒有辦法錄檔案-------------------------
Q: 老師 你好 我是上明天電腦圖學課的同學. 我的期末作業讀路檔案出了問題: 我用的是老師之前課堂上給的程式,一開始簡單的一兩個動作可以讀錄檔案,但是動作多以後就沒有辦法錄檔案
A: 沒有辦法錄 motion.txt 檔案的原因, 有可能是因為: (1) 檔案在你的程式其他地方正在讀取中 (reading)。我們上課教的檔案 FILE Input/Output 比較簡單, 所以同一次執行時, 檔案只能 fopen("motion.txt", "r") 或 fopen("motion.txt", "w+") 兩個選一個來做。如果正在 open as read, 那就不能再被 open as write。
解決方法, 是把小黑視窗關掉 (程式關掉、重開) 就不會被鎖住了。
---------------------動作非常緩慢感覺卡卡的---------------------
Q: 老師請問一下如果是機器人跑出來的時候做動作非常緩慢感覺卡卡的該怎麼解決 不是電腦問題因為已經使用三台電腦都是這個問題 但是同學電腦跑自己的都沒問題跑我的就動作卡卡的
A: 問題不在做動畫的程式碼。問題在你的 motion.txt 裡有一堆奇怪的東西...
什麼意思呢? 你用到舊的程式碼了。舊的程式碼, 會在 void motion()函式裡, 瘋狂的寫檔案, 所以你的 motion.txt裡會有幾百行, 因為想讓你看到東西在動。
後來老師教新的程式碼, void motion() 只負責用滑鼠調動作, 動作調好後, 要按 'w' 鍵才能存1行 motion.txt。所以 30秒的動畫, 裡面可能只有30行。你的 timer會在這30秒的動作裡, 逐秒去 alpha內插做動畫。
--------------------------希望機器人動作變快-----------可參考(動作非常緩慢感覺卡卡的)-----------
Q: 老師,我遇到了一個問題,就是我希望機器人動作變快,但是聽班上同學說,有一個預設的速度,要怎麼修改呢
A: 你遇到的問題, 有2種可能 (1) 應該不是動作太慢, 而是因為你的 motion.txt 檔案壞掉了(裡面有太多雷同的動作, 你可以檢查你的 motion.txt 看看裡面到底有幾行), 可參考這個連結 
(2) 如果的motion.txt沒有壞, 你只是希望動作可以快2倍 那就簡單了: 你只要把 float alpha= (t%30)/30.0 改成float alpha=(t%15)/15.0
這樣1秒如果有 30frame, 原本是 30 frame 一個動作, 現在變成 15frame 一個動作 (編輯的動作也要增加)

-------------運鏡問題--------------------

Q: 老師 我想問一下 我把自動旋轉的運鏡 (在timer2()裡面的程式) 已套到程式裡了 但是好像沒有反應
A: (1) 看起來是因為 timer2() 沒有被呼叫到。
(2) 你的程式在compile編譯時, 出現錯誤訊息, 說 timer2() 沒有先定義。在 C/C++裡, 函式需要先定義or宣告後, 才能使用。所以你只要把 void timer2(int t2) 函式放在前面, 就可以了。

-----------------想讓第二個東西有動作---------------------
Q: 請問老師 如果要讓第二個東西有動作 要再寫第二個motion檔嗎?
A: 很好的想法,可以。而且這樣可讓程式碼比較簡單易理解。
float angle1[20];//用來準備第1個人的動作
float angle2[20];//用來準備第2個人的動作
int angleID=1;
int userID=1;
FILE * fin1=NULL;//用來準備第1個人的動作
FILE * fin2=NULL;//用來準備第2個人的動作
void keyboard(...)
{
if(key=='a') userID=1;
if(key=='b') userID=2;
if(key=='w' && userID==1){ 用來寫動作到 fin1 }
if(key=='w' && userID==2){ 用來寫動作到 fin2 }
if(key=='1') angleID=1;
if(key=='2') angleID=2;
...
}
void mouse(...)
{
oldX=x; oldY=y;
}
void motion(...)
{
if(userID==1){
angle1[angleID] += (x-oldX);
}else if(userID==2){
angle2[angleID] += (x-oldX);
}
oldX=x;
glutPostRedisplay();
}
-------------專案正常執行問題--------------
Q: 老師不好意思又來打擾了,我不知道為什麼不能執行 (在學校可以跑的GLUT專案, 回家修改後就無法編譯。)
A: 
下方Build Messages寫找不到 GL/glut.h 表示 include 目錄設定不正確 or freeglut沒裝好。可能的問題很多種, 可可點選下方的Build Log 找到詳細原因。在Build Log裡, 可看到
C:\Users\user\Desktop\freeglut\include
但是電腦的桌面卻在
C:\Users\ASUS\Desktop
表示 學校電腦 與 家裡ASUS筆電 不同。



原來是學校的專案檔用的目錄 跟家裡專案檔用的目錄不一樣,導致會找不到你所需要的freeglut。 你手動的去改那個專案檔就可以了。

-----------------------------音樂問題---------------------------------------

------------------------------專案資料夾有放CMP3_MCI.h,但程式無法讀入------------------------
Q: 老師我想請教一下 專案資料夾有放CMP3_MCI.h 可是程式無法讀入
A: 這個問題比較簡單: 你第1行的 include 拼錯了
所以 沒能讀入 CMP3_MCI.h 自然就無法播放音樂

-------------------------------音樂播不出來的問題-------------------------
Q: 老師你好,我是資傳二甲的學生,我在作業上遇到了音樂播不出來的問題,想請問你在不在學校方便請您幫我看看嗎?
A: 不好意思今天下午我在台大開會, 然後回答問題直到現在才看到你的問題。對不起。關於音樂播不出來的問題, 有幾種可能:
(1) 音樂檔找不到, 請檢查音樂檔是不是在正確的 working 目錄裡,
(2) 音樂檔的檔名有問題, 有可能是副檔名被隱藏後, 讓你寫錯檔名,
(3) 檔案格式不支援, 像是 PlaySoundA()函式只能讀 WAV檔, 有人把 MP3檔改檔名成 WAV是沒辦法騙人的, 因為檔案裡面的內容不是 WAV格式就會無法解碼。


----------------------------貼圖問題---------------------------

----------------------------上了背景之後整個畫面看起來是暗的-------------------------------
Q: 老師不好意思打擾一下,我想請問為什麼我上了背景之後整個畫面看起來是暗的,我把id1 = myTexture("beach.jpg"); 暫時刪掉後卻能變回圖2正常的樣子。
A: 你遇到的問題, 是貼圖/貼圖座標 & 打光/法向量 錯亂的問題。
(1) 你在打光時, 貼圖的地方沒有正確的法向量(Normal), 所以光影變得極暗。
(2) 你在畫模型時, 因為貼圖座標有錯, 延用之前貼圖時最後1個頂點的貼圖座標, 而那個座標對應的圖的色彩很暗。
綜合上面2個問題, 所以你的畫面就變得很糟。解決方法: 在畫貼圖時, 不要開打光。在畫模型時, 不要開貼圖。
glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); 畫背景圖 glDisable(GL_TEXTURE_2D); gEnable(GL_LIGHTING);

----------------------------貼圖沒出現----------------
Q: 老師,請問為什麼我加了貼圖卻沒有出現圖(我的副檔名沒有錯)
A: 貼圖沒有出現, 有幾種可能 (1) 沒有在working目錄裡找到圖檔, 請檢查 working目錄裡有沒有檔案 (你可能也檢查過了)
(2) 你可以在讀圖檔後, 用上課時教的技巧, 馬上檢查看看能不能用 OpenCV的視窗先秀圖, 能的話就表示 OpenCV有讀到圖。
IplImage * img=cvLoadImage("檔名要一模一樣尤其是副檔名");
cvShowImage("opencv視窗", img);
cvWaitKey(0);
(3) 貼圖程式碼有兩塊: (a) 準備貼圖、(b) 使用貼圖, 可以用 printf()來幫忙看看有沒有跑到你的這兩個地方
(4) 可能你的貼圖的程式碼有錯
(5) 可能你使用貼圖的地方, 剛好不在畫出來的範圍裡。比如說你如果沒有改變 Projection Matrix, 則3D的範圍限定在 -1...+1之間, 而讓你的貼圖沒畫出來。
--------------------作業一開始常見問題--------------
------------------OpenCV Error: Null Pointer---------------------
Q: 老師我要做機器人跳舞的作業請問這是什麼問題 
OpenCV Error: Null Pointer (NULL array pointer is passed)
A: 你遇到的問題是圖檔沒辦法讀到, 所以 OpenCV就沒能讀到圖檔, 而出現 NULL Pointer的問題 (IplImage * img 沒能讀到東西, 就變成空指標)
---------------------程式碼執行無法繼續------------------------
Q: 老師你好,我想請問這樣是什麼原因? (程式碼執行無法繼續,因為找不到cv210.dll。重新安裝程式或許可以更正此問題。)
A: 你現在遇到的問題, 是因為 OpenCV 執行時需要的 dll檔 (cv210.dll, cxcore210.dll, highgui210.dll) 放在C:\OpenCV2.1\bin 目錄裡。但是你的程式執行時, 卻不會去 C:\OpenCV2.1\bin 裡找 .dll 檔案。原因有幾下幾種:
(1) 你在安裝 OpenCV 2.1 時, 有個畫面要你設定 Add PATH, 你要勾選第2個 or 第3個, 不能用第1個。 你可以重新安裝 OpenCV 2.1 並且重新勾選。這樣它就會把 C:\OpenCV2.1\bin 設到 PATH 裡面, 執行就找得到 .dll 檔了
(2) 如果你的 PATH有正確, 重開 CodeBlocks就可以成功執行
(3) 如果你很堅持不想要加 PATH 的話, 就需要手動把 cv210.dll cvxore210.dll highgui210.dll 這些執行時需要的檔案 copy 到你的專案目錄裡。這樣會浪費一些空間, 但就成功了。
----------------------------------
(2)複習:貼圖
(3)複習:打光
(4)複習:模型

沒有留言:

張貼留言