2024年6月6日 星期四

BK Week16

# week16


## week16-0_sample

0. 下載 freeglut 至桌面, 並解壓縮, 更改 lib 中的檔名

1. 安裝 OpenCV

2. 設定 CodeBlocks, 改Setting - Compiler

    a. compiler 的 include 要加入 C:\OpenCV2.1\include

    b. linker 的 lib 要加入 C:\OpenCV2.1\lib

    c. linker 設定, 要加入 cv210 cxcore210 highgui210

3. File-New-project, GLUT專案, week16-0_sample


接下來看一下課本範例

1. https://jsyeh.org/3dcg10/ -下載 data win32

2. 解壓縮 window.zip data.zip

3. 把 data 資料夾整個丟到 window 資料夾


## week16-1_sample_Lookat

1. File-New-project, GLUT專案, week16-1_sample_Lookat        

2. 要改 resize{} 函式, 在裡面加上 Lookat{} 函式, 如下列橘色部分所示

```cpp

    static void resize(int width, int height)

    {

        .,....

        glLoadIdentity() ;

        gluLookAt(0, 0, 0, -2.4, 1.2, -6, 0, 1, 0);

    }

```

3. 視角會改成由斜上往斜下看

4. 把剛剛 gluLookAt(0, 0, 0, -2.4, 1.2, -6, 0, 1, 0); 註解掉

5. 加入下面的橘色部分程式碼

```cpp

    static void key(unsigned char key, int x, int y)

    {

        if(key=='1'){ ///看左上方

            glMatrixMode(GL_MODELVIEW);

            glLoadIdentity();

            gluLookAt(0, 0, 0, -2.4, 1.2, -6, 0, 1, 0);

        }else if(key=='2'){ ///看上方

            glMatrixMode(GL_MODELVIEW);

            glLoadIdentity();

            gluLookAt(0, 0, 0, 0, 1.2, -6, 0, 1, 0);

        }else if(key=='3'){ ///看右上方

            glMatrixMode(GL_MODELVIEW);

            glLoadIdentity();

            gluLookAt(0, 0, 0, +2.4, 1.2, -6, 0, 1, 0);

        }

    .....

}

```

6. 最後可以看到三個不同角度的視角


## week16-2_glutReshapeFunc_gluPerspective_gluLookat

先看課本 Projection.exe 的範例


gluPerapective 透視投影

glOrtho 垂直投影

glFrustum 比較奇怪, 通常不使用這個投影法

左、又、下、上、進、遠 共6組參數


gluPerspective( 視角, 長寬比, z近, z遠 )

fovy filed of view in y視角

aspect ratio 長寬比


我們將要寫個程式, 11行 + 8行, 做出透視投影

1. File-New-project, GLUT專案, week16-2_glutReshapeFunc_gluPerspective_gluLookat

2. 貼上 11 行 GLUT 程式碼

3. 在 int main() 裡 加入 glutReshapeFunc(reshape);

4. 寫自己的 void reshape()

5. 加上下方橘色部分程式碼

```cpp

    void reshape (int w, int h){

        glViewport(0, 0, w, h); ///設定視窗會看到的區域

        float ar = w / (float) h; ///長寬比、寬長比

        glMatrixMode(GL_PROJECTION); ///切換投影矩陣

        glLoadIdentity();

        gluPerspective( 60, ar, 0.01, 100); ///透視投影


        glMatrixMode(GL_MODELVIEW); ///切換 model view 矩陣

        glLoadIdentity();

        gluLookAt(0, 2, -2,  0, 0, 0,  0, 1, 0);

    }

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

    {

    glutInitWindowSize(300, 600); ///這行可改視窗長寬    

    glutReshapeFunc(reshape); 

    }

```

6. 這個程式可以讓改變視窗大小的時候, 裡面的 圖的比例不變


## week16-3_myTexture_id1_id2_glBindTexture

若想要有「兩張貼圖」(一張背景、一張給模型)

1. File-New-project, GLUT專案, week16-3_myTexture_id1_id2_glBindTexture

2. 偷用 week05_rotating_earth 裡的程式碼

3. 但執行會出錯:OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376, 因為沒有圖檔!!

4. 所以要把圖檔放到 C槽 就會看到一顆轉動的地球


 5. 接著加上下面橘色部分的程式碼

```cpp

    int id1, id2;

    int myTexture(char * filename)

    {

        ......

    }

    void display()

    {

        glEnable(GL_DEPTH_TEST);

        glBindTexture(GL_TEXTURE_2D, id1); ///太空

        glBegin(GL_POLYGON);

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

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

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

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

        glEnd();

        glBindTexture(GL_TEXTURE_2D, id2); ///地球

    }

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

    {

        glutInit(&argc, argv);

        glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

       glutInitWindowSize(500,500); ///視窗大小

        glutCreateWindow("week016-3");

        glutIdleFunc(display);

        glutDisplayFunc(display);

        id1 = myTexture("C:/space.jpg");

       id2 = myTexture("c:/earth.jpg");

    }

```

 6. 會得到一顆地球在轉, 背景是太空的圖片


沒有留言:

張貼留言