這次是打光觀察
1.http://jsyeh.org/3dcg10 我們也先從這裡下載需要的檔案
2. 將下載的解壓縮 並將data glut32.dll放入windows
3.啟用Light Material.exe
P.S 在左圖上下分別按右鍵可以換圖與材質
GLfloat light_pos[]={ x, y, z, 燈光效果(0,1)}
x 左右光源移動
y 上下光源移動
z 前後光源移動
0 平行光 1 點光源
GLfloat light_Ka[]={ r, g, b, alpha} 環境光顏色
GLfloat light_Kd[]={ r, g, b, alpha} 漫射光顏色
GLfloat light_Ks[]={ r, g, b, alpha} 反射光顏色
GLfloat material_Ka[]={ r, g, b, alpha} 環境材質色
GLfloat material_Kd[]={ r, g, b, alpha} 漫色材質色
GLfloat material_Ks[]={ r, g, b, alpha} 反色材質色
GLfloat material_Ke[]={ r, g, b, alpha} 發出光的材質色
GLfloat material_Se= 反色指數(反色面大小)
--------------------------------------------------------------------------------------------------------------------------
接下來由模型製作作業範例
我們一樣使用freeglut步驟跟以往一樣
2.回原本網頁下載source把glm.h與glm.c放入我們的專案裡
有一點要注意 我們要把框框的副檔名改成.cpp
3.接下來在專案裡把我們的外掛載入
4.我們要在main檔裡可以讀取,所以需要這行
5.我們測試看看這樣的外掛模型可不可讀取
所以在框框區那 我們把圖型改成茶壺測試
6.重外面讀取obj模型
既然我們可以讀取3D模型了,那我們就讀取外面的模型進來使用
(1)從我們的source裡有transformation.c 我們用notepad++開啟他
我們搜尋glm搜到第三次有這段 把這段的程式碼複製下來
放入到我們的main裡(反白裡圖裡也有註解說明)
P.S pmodel要自己宣告 GLMmodel* pmodel = NULL;
glPushMatrix();
///glutSolidCone(1,1,slices,stacks);
///glutSolidTeapot(1);
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);
glPopMatrix();
glutSwapBuffers();
7.這樣不夠,讀不到檔案在哪
把我們的data資料夾放入freeglut/bin裡
然後再啟用程式
↑ ↑以上就會讀到我們的模型了
接下來當我們把多餘的程式碼刪除後會出現這樣的情況
我們的3D打光不見了
---------------------------------------------------------------------------------
進入如何在我們的模型上打光
圖上的程式碼就是我們所需要的
在此做點註解外的說明
如果沒有做3D深度啟用的話,會導致破圖
然後如果需要換角度的話
我們就使用這兩行程式碼去做更改
(此程式為對y軸轉90度)
#include "glm.h" GLMmodel* pmodel = NULL;float angle=90;static void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3d(1,0,0); glPushMatrix(); glRotatef(angle,0,1,0);
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); glPopMatrix(); glutSwapBuffers();}///光源設定,很多陣列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 };///Material設定,很多陣列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 };
int main(int argc, char *argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("Week 07 model with Lighting"); glutDisplayFunc(display); glEnable(GL_CULL_FACE);///背面不會畫出來 glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);///3D測試要打開才有效果 glDepthFunc(GL_LESS);///前後深度偵測(比較方法)
glEnable(GL_LIGHT0);///打開light 0 glEnable(GL_NORMALIZE);///自動有法向量normalize glEnable(GL_COLOR_MATERIAL);///要使用material glEnable(GL_LIGHTING);///開啟打光系統 ///Light 0的設定 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); ///Material的設定 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();
return EXIT_SUCCESS;}
以上程式碼是如圖相同 不多做說明
---------------------------------------------------------------------------------
最後一個 讓物件有關節移動
為了要讓物件有手臂的感覺,所以我們可以這樣寫
1.從上周所教的 放了身體後可以放入手臂記得TRT概念
2.讓滑鼠可以去做改變
記得main裡面要有這行 很重要!!










沒有留言:
張貼留言