2024年3月28日 星期四

BK Week06

 # week06

## 期中考題目

題目在這裡:jsyeh.org/gl


## week06-0_sample

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

1. File-New-project, GLUT專案, week06-0_sample

2. Ctrl+F "light"找下面的程式碼

```cpp

    const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };

    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };

    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };


    const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };

    const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };

    const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };

    const GLfloat high_shininess[] = { 100.0f };

```

```cpp

     glEnable(GL_DEPTH_TEST);

        glDepthFunc(GL_LESS);


       glEnable(GL_LIGHT0);

        glEnable(GL_NORMALIZE);

        glEnable(GL_COLOR_MATERIAL);

        glEnable(GL_LIGHTING);


        glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

        glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

       glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

       glLightfv(GL_LIGHT0, GL_POSITION, light_position);


        glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

        glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

        glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

```

## week06-1_lighting

1. File-New-project, GLUT專案, week06-1_lighting

2. 複製11行程式碼

```cpp

    #include <GL/glut.h>

    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("week06 lighting");

        glutDisplayFunc(display);

        glutMainLoop();

    }

```

3. 把剛剛 week06-0_sample 複製的8行放在  int main(int argc, char*argv[]) 前面

4. 把 week06-1_lighting 複製的12+2行放在 glutMainLoop() 的前面

5. 出現一個黑黑的背光立體茶壺


6. 然後改橘色部分可以把背光用掉
    const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };


7.再改橘色部分會有黃光打在茶壺上


## week06-2_lighting_glNormal3f

1. File-New-project, GLUT專案, week06-2_lighting_glNormal3f

2. 把剛剛 week06-1_lighting 的程式碼拿來用

3.加上 四邊形, 有設定 法向量 (橘色部分)

```cpp

    float angle = 0; ///想讓東西轉動

    void display()

    {

         glPushMatrix();

            glRotatef(angle++, 0, 1, 0); ///對Y軸轉

           glBegin(GL_POLYGON);

                glNormal3f(0, 0, 1); ///打光的法向量

                glVertex2f(-1, -1);

                glVertex2f(+1, -1);

               glVertex2f(-1, +1);

                glVertex2f(+1, +1);

            glEnd();

        glPopMatrix();

    }

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

    {
        glutIdleFunc(display);
    }

```


## week06-3_glm_obj_model

1. File-New-project, GLUT專案, week06-3_glm_obj_model

2. 貼11行程式碼

3. 從課本範例學習 source.zip 有3個程式檔: transformation.c    glm.h    gllm.c 解壓縮

4. 要將專案做設定
    
    a. 把 glm.h 放到 桌面\week06-3_glm_obj_model 目錄裡

    b. 把 glm.c 放到 桌面\week06-3_glm_obj_model 目錄裡, 改檔名 glm.cpp

    c. 在 CodeBlocks 的專案裡按右鍵 Add Files, 加入    

    d. 要把 data 資料夾, 放到 桌面\freeglut\bin 目錄裡

5. 用 Notepad++ 開啟 transformation.c 研究他的程式碼, 關鍵字 glm 找到程式碼

    a. #include "glm.h";

    b. GLMmodel* pmodel = NULL;

    c. drawmodel() 的函式

```cpp

    #include <GL/glut.h>

    #include "glm.h" ///5-a

    GLMmodel* pmodel = NULL; ///5-b

    void

    drawmodel(void) ///5-c

    {

        if (!pmodel) {

        pmodel = glmReadOBJ("data/Al.obj");

        if (!pmodel) exit(0);

        glmUnitize(pmodel);

        glmFacetNormals(pmodel);

        glmVertexNormals(pmodel, 90.0);

    }

        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

    }

    void display()
    {
        drawmodel(); ///glutSolidTeapot(0.3);
    }

```

6. 只有黑白是因為 沒打光



沒有留言:

張貼留言