2024年3月28日 星期四

電腦圖學 Week06 🥴

期中考模擬練習:https://jsyeh.org/gl/

找範例中light程式碼:week06-0_sample

1. moodle下載 freeglut 拖到桌面

2. 把桌面\freglut\lib\libfreeglut.a 複製成 libglut32.a

3. CodeBlocks開GLUT專案, 目錄選桌面, 專案名取week06-0_sample

4. GLUT要選桌面的 freeglut

5. Ctrl+F 尋找有light的程式碼
//宣告
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 };
//函式
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. CodeBlocks開GLUT專案, 目錄選桌面, 專案名取week06-1_lighting

2. GLUT要選桌面的 freeglut

3. 貼上11行GLUT程式
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
//這裡放打光的陣列宣告8行
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week06 lighting");
    glutDisplayFunc(display);
    //這裡放打光的12+2行程式碼
    glutMainLoop();
}

4. 執行時因為光線背光所以茶壺是暗的, 需要調整角度
const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

5. 把燈光改成黃色的
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 0.0f, 1.0f };

觀察課本打光範例Light Material.exe

1. 下載課本的範例 https://jsyeh.org/3dcg10 windows.zip(win32) 及 data.zip(data)

2. windows.zip 先解壓縮, data.zip 直接點開拉到windows資料夾

3. 執行 Light Material.exe

4. 左上角視窗按右鍵可以換模型、左下角視窗按右鍵可以換材質

打光的法向量:week06-2_lighting_Normal3f

1. CodeBlocks開GLUT專案, 目錄選桌面, 專案名取week06-2_lighting_Normal3f

2. GLUT要選桌面的 freeglut

3. 貼上上一個程式碼(week06-1_lighting), 再加上四邊形並設定法向量

4. 在最上面宣告angle, 並在display上面裡加上程式碼
float angle = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    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();
        glutSolidTeapot( 0.3 );
    glPopMatrix();
glutSwapBuffers();

5. main函式加上一行程是碼
glutIdleFunc(display);

6. 最後會讓打光的茶壺旋轉並且多一個四邊型

3D模型:week06-3_glm_obj_model

1. CodeBlocks開GLUT專案, 目錄選桌面, 專案名取week06-3_glm_obj_model

2. GLUT要選桌面的 freeglut

3. 貼上11行glut程式碼

4. 從課本範例 source.zip 中找到 transformation.c / glm.c / glm.h 三個檔案並拉出來

5. 打開transformation.c, 搜尋glm找到以下程式碼
#include "glm.h" ///加的程式,使用glm的程式碼
GLMmodel * pmodel = NULL; ///加的程式,有顆指標,指到模型檔
drawmodel(void)
{
    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);
}

6. 把 glm.c / glm.h 拉到 Desktop\week06-3_glm_obj_model 目錄裡, glm.c改名為glm.cpp

7. 在week06-3_glm_obj_model 專案裡按右鍵新增 glm.cpp檔案

8. 把 data資料夾 拉到 Desktop\freeglut\bin 目錄裡

9. 加上第5.找到的程式碼, 並把display裡的茶壺換成drawmodel();

10. 最後會顯示一個3D模型, 因為沒打光所以看起來是平面的

沒有留言:

張貼留言