顯示具有 09160056_蔡晨馨 標籤的文章。 顯示所有文章
顯示具有 09160056_蔡晨馨 標籤的文章。 顯示所有文章

2022年6月14日 星期二

尖🦉-圖學筆記 Week17

◇整學期複習

環境:

    1.開glut專案,將openCV 等等環境設定好。

    2.改工作目錄(cdp檔用notepad++打開)working_dir=改成 . 。將freeglut.dull複製一份到專案

程式:

    1.寫好10行,和打光程式碼。

    2.將glm.h 、glm.cpp(先把glm.c改成glm.cpp,再從codeblock Add 進去)加入

    3.指定好模型,並讀入

    4.加上燈光、貼圖、reshape程式等等。


◇一些小地方可以調整注意

    1.改變模型讀入的大小:

        將GLMmodel * myReadOne(char * filename)函式裡的:

        glmUnitize(one);改成glmScale(one,1/26.0);

    2.可用glDisable(GL_TEXTURE_2D); / glEnable(GL_TEXTURE_2D); 再需要的模型之間

       開啟或關閉貼圖

    3.reshape()函式裡的

       gluLookAt(0, 0 ,2.5 ,    0, 0, 0,   0, 1, 0);

       可設定攝影機看的方向(更改第一個x,y,z的z軸),如果打光有問題可以改打光的,

        const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };///z的加負號

    4.圖片大小最好是正方形。

    5使用多張貼圖:

        先宣告好貼圖 ex: int skin;。

        在main()函式把貼圖檔案匯入ex:skin = myTexture("data/skin.png");

        之後在display()你要貼的模型位置寫入ex: glBindTexture(GL_TEXTURE_2D, skin);

2022年6月7日 星期二

尖🦉-圖學筆記 Week16

 ◇alpha內插公式:

    1. angle = alpha*新角度 + (1-alpha)*舊角度。

        alpha值為0.0~1.0。所以alpha=0 則為舊anglealpha=1 則為新angle,其他介於新舊之間。

 ◇interpolation 內插實作(讓動畫angle變動順暢):

    1.開新glut專案,利用上禮拜的程式week15_angle_again程式

    2. 寫入新的myInterpolate函式keyboard加入play鍵myRead函式寫入讓他能新舊角度交換。

        myInterpolate()函式:藉由新舊角度運算,算出每個angle。

        keyboard()函式:藉由 t=0 ,呼叫myInterpolation()函式,放入 ( t %30 )/30.0 運算會介於                                                 0.0~1.0之間(作為alpha值的運算),當我們 t 為30時,就又會變成0。

        myRead()函式:使新舊角度交換,並重畫顯示畫面,就能看到順暢的動作。

    3.因為原本要一直按p才能動,但我們想要他自動跑。

        將keyboard函式修改,並增加timer函式,讓他會依照時間呼叫自己。

 ◇攝影機觀察:

    1.藉由老師上課教材Projection.exe了解

    2. gluLookAt -> eye 是相機拍向人物的相機座標。(相機位置)

        gluLookAt -> center是相機拍攝哪裡。(可以專拍手或是專拍頭,對eye那個點做變動)

         gluLookAt -> up  是相機拍攝旋轉角度。(有點像是旋轉相機,對著center那個點旋轉)

專注拍攝哪裡(center)
拍攝角度旋轉(up)

    3.對下面command manipulation window視窗 右鍵 可選glOrtho看到拍攝框


 ◇攝影機:

    1.開新專案,留下static void resize()函式。

        static void resize()函式,可讓視窗變化的時候,3D物件的長寬會跟著視窗比例變化

        就不會壓扁3D物件了。

        aspect ratio 是長x寬比(x往右,y向下) ex: 1920x1080 , 1280x720 ,640x480 , 16:9 ,4:3。 

    2.先#include<GL/glut.h>

      修改resize()函式變成reshape()

      main函式利用glutReshapeFunc(reshape);呼叫reshape

   ◇攝影運鏡:

    3.加入motion()函式,讓我們能用滑鼠調整看的角度,感受到運鏡。

2022年5月31日 星期二

尖🦉-圖學筆記 Week15

 ◇ 播放聲音の不同方法:

   1.開一個Empty File

    2.運用#include <windows.h>  。上週是用#include < mmsystem.h>

    3.PlaySound( "檔名.wav" , NULL, SND_SYNC);  等待聲音播完,同步。

       PlaySound( "檔名.wav" , NULL, SND_ASYNC); 不等待聲音播完,直接執行下一行程式(上週使用)。

    4.設定 上方Settings-Compiler Settings →Linker settings   add要加入 winmm

        這樣才能撥放聲音!

    5.上網找音檔wav,放到跟程式同一個目錄,就能撥放!

         可在這裡找免費的:https://sound-effects.bbcrewind.co.uk/search

    ★可藉由SND_ASYNC,加上輸入,就能快速切換音效,不需要等音效播完。

    ★這邊的wav會傳到音效卡再撥,PlaySound只能播放wav檔

 ◇播放mp3檔

   1.去moodle下載 CMP3_MCI.h 放在同目錄裡。

    2.開新Empty File

    3.先#include "CMP3_MCI.h"  *記得是雙引號不是 < >"

    4.mp3.Load("檔名.mp3");和mp3.Play();,就能播放聲音

 ◇動畫使他順暢

   1.開新GLUT專案,複製上周動畫程式。

    2.更改 keyboard()函式增加

        if( key=='s') mywrite(); ///調好位置後,按S才一次存檔

       motion()函式註解掉 mywrite(); ///只要移動位置就會存檔

        存檔的內容會放在工作目錄freeglut/bin,也可以像上禮拜的調整存到專案裡。

        就能在那找到文字檔,複製位置比較快。

    3.一樣存好位置後,一直按R就能動了

 ◇擺動作動畫(作業):

   1.建立新的GLUT專案。

    2.更改working_dir 工作目錄。

        →到專案資料夾,將cdp檔右鍵nope++打開,將working_dir 的地方改成 .

        打開codeblocks按YES就行。

    3.將freeglut/bin 裡的freeglut.dull複製到專案目錄。

    4.將glm.h ,glm.cpp 及 模型檔放入data資料夾 放入專案資料夾。

        記得要在codeblocks add glm.cpp。

    5.將模型導入

        先放入指標GLMmodel * pmodel =NULL;

        在display函式前寫進導入模型函式

        在display函式放入

2022年5月24日 星期二

尖🦉-圖學筆記 Week14

 ◇寫檔(File output):

   1.先開一個empty 檔,存成.cpp檔。

    2.fopen()開啟檔案(可產生一個檔案)、fprintf() 寫入檔案、fclose()關閉檔案

        FILE * fout = fopen("檔名","模式"); FILE記得要大寫。

        按齒輪會產生兩個檔案,當你按齒輪+執行會出現fopen裡寫的檔。

讀檔(File Intput):

   1.先開一個empty 檔,存成.cpp檔。

    2.FILE * fin = fopen("file.txt","r");//////打開檔案,讀入file.txt指到fin。

       fscanf(fin,"%f",&angle);///讀到"檔名"檔案的浮點數,後面記得要&讀入。

 ◇利用上週程式week13_moreTRT,用寫檔:

   1.開新專案,複製上周的程式。

    2.先include <stdio.h>。

    3.創建一個FILE * fout =NULL;,並寫mywrite()函式。

    4.再motion函式裡,呼叫mywirte()在motion裡打mywirte()

        當我們轉動圖形角度,角度就會在小黑印出來。

    5.最後加上printf("\n");  fprintf(fout ,"\n"); 讓我們好讀。

 利用寫檔程式,加入讀檔進而產生動畫:

   1.再開一個檔案,複製寫檔的程式。

    2.設定好fin ,並寫入myRead()函式。

       FILE * fout =NULL, * fin =NULL; 把讀檔的檔案也設好。

         if(fout !=NULL ){ fclose(fout); fout = NULL; } 當我們按下r時,fout不是空的就關掉他並清除

         glutPostRedisplay();///重畫畫面,才會有效果。

    3.在keyboard函式寫進

        if (key == 'r') myRead(); ///當按著r就會動,長按。

        ☆當我們移動好圖形的動作後,長按r,他就會一直讀取我們剛剛寫入的angle值,之後myRead()會讀入,產生動作的效果。

◇更改工作目錄到專案:

   因原本的目錄在freeglut\bin,但我們希望產生的東西都放在專案裡頭。

    1.到我們專案的資料夾,將.cdp檔用notepad++打開

    2.working_dir的位置改成 . ,存檔回到Codeblocks。

        codeblocks會問你要不要重新執行,請按確認。

    3.此時執行時,會出問題,所以要將freeglut\bin 資料夾裡的freeglut.dll,複製到專案資料夾裡。

    複製好後就能執行:)

◇計時器 glutTimeFunc()

    因為keyboard會由延遲,動畫會不順

   1.開啟新GLUT專案。

    2.寫程式:

        glutTimerFunc(等多久時間, timer ,t參數)

    ◆自動呼叫timer,簡化程式:

    1.在 timer函式裡呼叫自己。

        因為Main函式有glutTimerFunc(5000,timer, 0); 他會等五秒後再呼叫timer函式。

        之後函式裡面就會自己呼叫自己並顯示出來了。

◇播放聲音:

   1.利用 PlaySound() 先下載do.wav音檔

    2.先加#include <mmsystem.h> 

    3.在timer函式加PlaySound("do.wav", NULL , SND_ASYNC); 撥放do.wav聲音。

2022年5月17日 星期二

尖🦉-圖學筆記 Week13

◇利用矩形了解TRT運作:

   1.加上glRectf(x1,y1,x2,y2);//矩形程式碼

        glutInitWindowSize(x,y);//可自行設定畫面大小

    2.再加一個Rect模擬手臂,並加上TRT程式。

       畫glRectf(0.3,0.5,0.7,0.3); (在下面圖的原位)

       TRT三步驟:(1)旋轉中心從(0.3 , 0.4)移到(0 , 0)。→glTranslatef(-0.3,-0.4,0);

                           (2)對z軸旋轉 glRotatef(angle,0,0,1);

                           (3)利用Translatef(0.3,0.4,0)再把手臂拉回原位。

    3.利用鍵盤mouse motion 來改變angle

        增加mouse函式和motion讓他轉動的函式:

        並在main函式呼叫函式:

       最後完成:

 ◇再增加TRT:

   1.再加一個下手臂(和上手臂的步驟一樣)

     2.左邊手臂也出來(將右手臂座標正負相反,因為鏡射)

        最後程式碼:

 ◇藉由keyboard讓我們可以選擇關節轉動:

   1.將angle改成陣列float angle[20];

        之後再原本是angle的地方改成陣列的形式!並設定每個關節是幾號。

        ex: glRotatef(angle[1],0,0,1);

    2.設定 int angleID=0; 讓我們能挑第幾號關節。

        (1)新增一個keyboard函式,讓我們按對應鍵盤時,能調整angleID的值。

        (2)motion函式 angle[0]+=(x-oldX);要改成angle[angleID]+=(x-oldX);

      (3)main函式要加 glutKeyboardFunc(keyboard);

    3.最後完成


2022年5月10日 星期二

尖🦉-圖學筆記 Week12

 ◇Transformation.exe範例:

    1. 在下方Command manipulation window視窗右鍵可以swap 移動(translate)跟轉動(rotate)。

    2.自轉:(由下往上讀程式碼)

        glTranslatef時,是模型整個被移動

        glRotatef,會是車子中心軸轉。

        glScalef和glbegin建好一台車子。

    3.公轉:(由下往上讀程式碼)

        glRotatef時,是車子繞中心軸旋轉。

        glTranslatef,是模型整個被移動(想像他被移到大盤子右邊);

        glScalef和glbegin建好一台車子。



◇其他範例(OpenGL T-R-T):

    1. 到120.125.80.50/GL/ 網站看T-R-T對特定軸轉動練習

    2.左邊畫面畫完,右邊myDrawObject會增加 並且 它可以換位置(似圖層意思)

        可以重新整理網頁清除剛剛的操作。

    3.angle點一下再按空白鍵,就能自動改變值。

        將 物件(myDrawObject) 和 移動(Translate) 放在 旋轉glRotate下方就能轉。

      上方程式會影響下方的程式碼,所以才要放在下方。

        ex:像圖片的,myDrawObject(0)就不會跟著轉。

    4.點glTranslatef()變紅色後,再到左邊的視窗就能拖移位置。(可讓中心軸移動)
        glPushMatrix(x,y,z);

            glRotatef(angle,0,0,1); //會使下面整個的東西選轉。       

            glTranslatef(-x,-y,0) //往左下角移動後,會是中心點。(其中一個)

            myDrawObject(1); //物件

        glPopMatrix();

    5.把另外一個glTranslatef()擺到 第4點 glRotatef()上面。

        glPushMatrix();

            glTranslatef(x,y,z);//會讓物體移到這個位置

            glRotatef(angle,0,0,1); //會使下面整個的東西選轉。       

            glTranslatef(x,y,z); //使它成為物體的旋轉中心點!

            myDrawObject(1); //物件

       glPopMatrix();

◇下周考試:

   1.將程式順序寫好(像上面的第5點)

    2.因要中心軸移到(0,0),ex:原本再(0.8,0.9),所以要改成(-0.8,0.9)

    3.旋轉角度更改! 還有物體位置要改!

◇實作:

    1.先開一個GLUT專案

    2.貼完三段程式碼!

    3.新增一個身體跟手茶壺,並修改 手的 旋轉中心點位置。(可一步一步來比較好理解)

    glTranslatef(0.4,0.15,0); /// (3).把它往右放(圖的綠色線條)

      glRotatef(angle,0,0,1); /// (2).旋轉

      glTranslatef(0.2,0,0); /// (1).旋轉中心放到世界中心,希望 手茶壺的中心旋轉軸 在把手位置,因大小是0.2,才往右0.2。(原本在橘色點,要移到粉紅色點)


◇作業:

    1. 需要用3D模型!並且需要有身體部分切割!(身體、上手臂、下手臂),並要將3D模型讀進去。

    2.運用下面程式碼寫出來!(在複製一份 改個位置 就能做出左邊手臂)

VERY BEAUTIFUL, VERY POWERFUL

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