2017年4月17日 星期一

20170417_Week07 佳諭der課堂筆記



Week 07 課堂內容筆記摘要



作業一 
1.下載 [data] [win32] [glut32.dll] [source] 壓縮檔並進行解壓縮到桌面。
















2. [window] 檔案開啟並合併[data] [glut32.dll] 檔案到裡面

















3.在 [source].zip 壓縮檔裡面找出 glm.h glm.cpp 檔案並執行以下動作。

















*相對路徑修改及執行:
(1) windows.zip >> 桌面\windows\Transformation.exe
(2) data.zip >> 桌面\windows\data\soccerball.obj + soccerball.mtl 
( 共有7組模型檔案 obj+mtl )
(3) glut32.dll >> 桌面\windows\glut32.dll


4.進行切換模型的實作並分析程式碼使用形式及意義。
(開啟7組模型檔案並使用Notepad++按右鍵開啟程式碼)

















程式碼

*v開頭 >> vertex /*代表頂點*/
*vn開頭 >> vertex normal /*代表打光的法向量*/
*vt開頭 >> vertex texture coordinate /*貼圖座標*/
*f開頭 >> face /*點線面的面*/




作業二 -  製作、匯出3D之obj檔(程式碼)
1.開啟Autodesk Maya之3D模型介面
(此為本人在3D Maya 實務所製作的電腦主機)

















2.開啟 Windows > Settings/Preferences > Plug-in Manager 並檢視 objExport.mll 是否有勾選(Loaded + Auto load)
































3.開啟 File > Export All 做匯出的動作且另存新檔並改變儲存的檔案類型(改為OBJexport)


















4.在桌面上即可出現自己匯出的Maya模型OBJ檔(包含.obj 及.mtl)




















作業三 - 從codeBlocks執行Maya模型之OBJ檔
1.開啟 codeBlocks 並開啟舊檔(File > Open > 選擇自己的程式碼資料夾)
















2.按下Build可執行程式碼及Maya模型顯示。
(此為老師在課堂所示範之資料夾程式碼執行檔)

















3.將今日所學程式碼做細部講解及分析實際意義。

*注意:自己的程式碼資料夾要與freeglut資料夾同時放在桌面,程式碼才可以順利執行。






























程式碼
(此程式碼會顯示在main.cpp中)

#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"

GLMmodel * pmodel = NULL;
/*一開始因為沒有讀入模型而宣告指標(*pmodel)為NULL(空字元)*/
float angle=0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        angle++;
        glRotatef(angle, 0,1,0);
        if (!pmodel) 
        /*一開始如果讀到空指標那便執行讀入模型的動作*/
        {
        pmodel = glmReadOBJ("data/msi.obj");  
        /*此為讀入模型之檔案名稱及路徑(檔名拼字及目錄要正確)*/
        if (!pmodel) exit(0);  
        /*讀入模型後若還是空的就表示失敗了,因此執行閃退的動作*/
        glmUnitize(pmodel);  
        /*Unitize表示單位化,如果沒有這行,可能會造成模型太大或太小會看不到*/
        /*如果自己的Maya有設定好模型本身全部的大小,那就不需要用到glmUnitize() */
        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 };

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_DOUBLE | GLUT_DEPTH | GLUT_RGB);
    glutCreateWindow("Yes, 3D Model Here");

    glutDisplayFunc(display);  /*顯示的函式*/
    glutIdleFunc(display);  
    /*此行可讓程式在閒置的時候也執行顯示的動作,且剛好可讓angle++執行*/

    glClearColor(1,1,1,1);
    ///glEnable(GL_CULL_FACE);  /*這兩行要刪掉才可正面顯示*/
    ///glCullFace(GL_BACK);  /*此兩行代表模型反面顯示*/

    glEnable(GL_DEPTH_TEST);   /*開啟深度測試3D功能*/
    glDepthFunc(GL_LESS);
    /*執行深度測試時的函式,是用來比大小的。(小於代表"Less")*/
    /*在initial(預設)的值就是GL_LESS,也可自己做調整的動作*/
    
    glEnable(GL_LIGHT0);  /*開啟GL_LIGHT0,代表第0個燈*/
    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);

    glutMainLoop();  /*GLUT主要的迴圈*/

}




沒有留言:

張貼留言