2024年3月25日 星期一

賀week06_電腦圖學

2024-03-25 Week06
1. 主題: OpenGL 必背10函式
2. 主題: 打光 Lighting
3. 打光的法向量 glNormal3f(nx, ny, nz);
4. 3D 模型

網址:jsyeh.org/gl




##week06-0_sample_code

0.安裝freeglut,將 lib\libfreeglut.a 複製成libglut32.a

1.File-New-Project,GLUT專案,week06-0_sample_code

2.研究一下 main.cpp 程式碼177行,找到全部的light(光)相關的程式



20行程式 8行+12行
```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);
```


## 看課本範例
1. jsyeh.org/3dcg10下載 source data win32
2.windows.zip=> 下載\windows\Lighting.exe
3.data.zip=>下載\windows\data\一堆模擬
4.Lighting.exe 是今天的主角


##week06-1_lighting
1.File-New-Project,GLUT專案,week06-1_lighting
2.先貼上 11行 GLUT的程式
3. 再把剛剛的20行程式拿來用
4. 會畫出一個很立體的茶壺

改變光的位子

光打在茶壺上(加個負號)(亮面變大)
改成:const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };

茶壺變黃
色(把第三個從1.0f---->0.0f)
改成:const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 0.0f, 1.0f };



##week06-2_lighting_glNormal3f
1.File-New-Project,GLUT專案,week06-2_lighting_glNormal3f
2.先貼上剛剛的week06-1_lighting 的程式
3.我們要把茶壺,變成一個正方形
4.加上mouse 轉動這個正方形
(它會動動正方形,然後會從輝變黃色

```cpp
glBegin(GL_POLYGON);
    glNormal3f(0,0,1);
    glVertex2f(-1,-1);
    glVertex2f(+1,-1);
    glVertex2f(+1,+1);
    glVertex2f(-1,+1);
blend();

```



##week06-3_glm_obj_modle
1.File-New-Project,GLUT專案,week06-3_glm_obj_modle
2.把11行程式GLUT,先做出來
3.參考 source.zip裡面的 transformation.c 找裡面的 glm開頭的程式
3.1.#include "glm.h"
3.2. GLMmodel*pmodel =NULL;
3.3.讀模型、畫模型void drawmodel(void) 這個函式
4. 將檔案準備好:
4.1. glm.h 放到 week06-3_glm_obj_model 目錄裡 
4.2. glm.c 放到 week06-3_glm_obj_model 目錄裡,改檔名
4.3.專案,按右鍵,新增檔案,將glm.cpp加入檔案
4.4.將data資料夾,複製到 桌面\freeglut\bin 裡面(歷史餘毒)
4.5. 把 glutSolidTeapot(0.3); 換成 draw model();

```cpp
void
drawmodle(void)
{
    if(!pmodel){
        pmodel=glmReadOBJ("data/porsch.obj");
        if(!pmodel)exit(0);
        glmUnitize(pmodel);
        glfacetnormalf(pmodel);
        glmVertexNormals(Model,90.0);
    }
    glmDraw(pmodel,GLM_SMOOTH | GLM_MATERIAL);
}

```



##include "glm.h"

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




沒有留言:

張貼留言