2024年3月18日 星期一

SY-BlingBangBang電腦圖學🎬-Week05

1. 貼圖

    step1: 安裝 OpenCV-2.1,要加 PATH (第二個),用預設目錄

    step2: 重開 CodeBlocks ,設定貼圖的3個設定 Settings-Compiler

    setp3: 在 Search directories 加入2個目錄

              Compiler 👉 C:\OpenCV2.1\include

              Linker 👉 C:\OpenCV2.1\lib

    step4: 在 Linker setting 裡,加入 👉 cv210

                                                   👉 cxcore210

                                                   👉 highgui210

    step5: 開空白檔案,檔案名稱 "week05-1_opencv.cpp"

    step6: 寫程式碼 👉 #include <opencv/highgui.h>

                                int main()

                                {

                                        ///大寫I,小寫pl (Intel performance library)

                                        IplImage * img = cvLoadImage("c:/micky.jpg");

                                        ///大寫的Image 圖檔請放在 c:跟目錄裡,micky.jpg

                                        cvShowImage("week05 micky", img); 

                                        ///秀圖(兩個參數不確定)

                                        cvWaitKey(0); ///等任意鍵,再繼續

                                }

2. 下載課本範例,https://jsyeh.org/3dcg10/ 👉 [data][win32]


    step1: 打開範例 👉 Texture

    step2: 跑範例,觀察 👇

    glBegin(...);

        glTexCoord2f(tx, ty); glVertex2f(x, y);

        glTexCoord2f(tx2, ty2); glVertex2f(x2, y2);

        glTexCoord2f(tx3, ty3); glVertex2f(x3, y3);

        glTexCoord2f(tx4, ty4); glVertex2f(x4, y4);

    glEnd();














   

3. 將米老鼠和茶壺同時從小黑式窗叫出

    step1: 下載 freeglut-MinGW-3.0.0-1.mp.zip 

    step2: 進到資料夾,把檔案 freeglut 拉到桌面

    step3: 點進 freeglut 👉 lib 資料夾

    step4: 複製 libfreeglut.a 並且改名為libglut32.a

    step5: 新增專案,專案名稱 "week05-1_texture_opencv_cvLoadImage"

    step6: 將十行程式碼貼上

    step7: 再加上1. 的三行程式碼,變成以下程式碼 👇

    #include <GL/glut.h>

    #include <opencv/highgui.h>

    void display()

    {

        glutSolidTeapot( 0.3 );

        glutSwapBuffers();

    }


    int main(int argc, char *argv[])

    {

        IplImage * img = cvLoadImage("c:/micky.jpg");

        cvShowImage("opencv", img);

        glutInit(&argc, argv);

        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

        glutCreateWindow("week05-1 texture opency");

        glutDisplayFunc(display);

        glutMainLoop();

    }

















4. 結合 👉 茶壺和地球平面圖

    step1: 新增專案,專案名稱 "week05-2_texture_teapot_earth"

    step2: 修改、增加、剪貼18行貼圖的程式碼程式碼 👉

    #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可

    #include <opencv/cv.h>

    #include <GL/glut.h>

    ///老師給的程式碼

    int myTexture(char * filename)

    {

        IplImage * img = cvLoadImage(filename); ///OpenCV讀圖

        cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)

        glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能

        GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID

        glGenTextures(1, &id); /// 產生Generate 貼圖ID

        glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 

            /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

            /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,

        GL_NEAREST); 

            /// 貼圖參數, 放大時的內插, 用最近點

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,

        GL_NEAREST);

            /// 貼圖參數, 縮小時的內插, 用最近點

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0,

        GL_RGB, GL_UNSIGNED_BYTE, img->imageData);

        return id;

    }

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

        glutCreateWindow("week05 texture");


        glutDisplayFunc(display);

        myTexture("C:/earth.jpg"); ///下載的地球平面圖


        glutMainLoop();

    }



5. 貼地球平面圖

    step1: 新增專案,專案名稱 "week05-3_texture_polygon"

    step2: 複製 "week05-2_texture_teapot_earth" 的程式碼

    step3: 修改display的函式 👉

    void display()

    {

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBegin(GL_POLYGON);

            glTexCoord2f(0, 0); glVertex2f(-1, -1);

            glTexCoord2f(1, 0); glVertex2f(1, -1);

            glTexCoord2f(1, 1); glVertex2f(1, 1);

            glTexCoord2f(0, 1); glVertex2f(-1, 1);

        glEnd();

        glutSolidTeapot( 0.3 );

        glutSwapBuffers();

    }


    step4: 修改,地球上下矯正

    glTexCoord2f(0, 0); glVertex2f(-1, 1);

    glTexCoord2f(1, 0); glVertex2f(1, 1);

    glTexCoord2f(1, 1); glVertex2f(1, -1);

    glTexCoord2f(0, 1); glVertex2f(-1, -1);


6. 旋轉茶壺

    step1: 新增專案,專案名稱 "week05-4_texture_earth_rotating"

    step2: 貼上10行程式碼,加上18行的貼圖程式碼(4. step2)

    step3: 加上3行程式碼

              display 前 👉 float angle = 0; ///要有個旋轉的角度

              display 👉 glEnable(GL_DEPTH_TEST); ///開啟3D的功能(深度測試)

                              glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

                              glPushMatrix();

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

                              glPopMatrix();

              main 👉 glutIdleFunc(display);



7. 地球旋轉 

    step1: 直接修改 "week05-4_texture_earth_rotating" 的程式碼

              display 前 👉 GLUquadric * quad = NULL; ///用來畫地球的quad二次曲面

              display 修 👉 glPushMatrix();

                                        glRotatef(90, 1, 0, 0);

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

                                        gluSphere(quad, 1, 30, 30);

                                  glPopMatrix();

                                  glutSwapBuffers();

              main 👉 quad = gluNewQuadric();

                           gluQuadricTexture(quad, 1);



沒有留言:

張貼留言