2018年4月29日 星期日

Week 07 邱顯傑

這次是打光觀察


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=          反色指數(反色面大小)






--------------------------------------------------------------------------------------------------------------------------

接下來由模型製作作業範例


1.首先先使用glut專案




   我們一樣使用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裡面要有這行   很重要!!

沒有留言:

張貼留言