2024年3月25日 星期一

SY-BlingBangBang電腦圖學🎬-Week06

1. 期中考試練習網址: https://jsyeh.org/gl/











2. 研究打光

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

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

    step3: 點進 freeglut 👉 lib 資料夾

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

    step5: 開啟code blocks

    step6: 選擇File 👉 new 👉 project 👉 GLUT 👉 專案名稱:week06-                                    0_sample_code 👉 路徑選擇:桌面-freeglut 👉 執行 (Build and Run)

    step7: 研究一下 main.cpp 程式碼177行

    step8: 20行+8行

    step9: 開新專案,專案名稱: week06-1_lighting

    step10: 貼上程式碼

                👉 打光相關呼叫函式

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


                    glutMainLoop();

                👉 打光相關矩陣程式碼

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














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

    step1: 開啟打光的範例 👉 Light Material.exe

    step2: 研究光的位置/數值

    step3: 修改程式碼,從背光變面光









    step4: 改變打光顏色






4. glNormal3f 範例

    step1: 開新專案,專案名稱: week06-2_lighting_glNormal3f

    step2: 複製06-1的程式碼,再新增程式碼

              👉 display 加

                   glPushMatrix();

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

                        glScalef(0.8, 0.8, 0.8);

                        glBegin(GL_POLYGON);

                            glNormal3f(0, 0, 1);

                            glVertex2f(-1, -1);

                            glVertex2f(+1, -1);

                            glVertex2f(+1, +1);

                            glVertex2f(-1, +1);

                        glEnd();

                    glPopMatrix();

              👉 main 加

                   glutIdleFunc(display);


5. glm 範例

    step1: 開新專案,專案名稱: week06-3_glm_obj_model

    step2: 參考課本範例 source 

    step3: 貼上11行程式碼

    #include "glm.h" ///加的程式,使用glm的程式碼

    GLMmodel * pmodel = NULL; ///加的程式,有顆指標,指到模型檔

    void drawmodel(void)  ///讀模型、畫模型

    {

        if(!pmodel){

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

            if(!pmodel) exit(0);

            glmUnitize(pmodel);

            glmFacetNormals(pmodel);

            glmVertexNormals(pmodel, 90.0);

        }

        glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);

    }

    step4: 準備檔案,從課本範例的 source

              👉 glm.h 放到專案目錄

              👉 glm.c 放到專案目錄,改名為 glm.cpp











              👉 到專案,在專案名稱上按右鍵,Add File 將glm.cpp 加入專案











                👉 將課本範例的 data 資料夾,複製到 freeglut/bin












    step5: 修改程式碼

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

              void display() 👉 drawmodel(); ///glutSolidTeapot( 0.3 );



沒有留言:

張貼留言