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 轉動這個正方形
(它會動動正方形,然後會從輝變黃色
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);






沒有留言:
張貼留言