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 )
( 共有7組模型檔案 obj+mtl )
(3) glut32.dll >> 桌面\windows\glut32.dll
4.進行切換模型的實作並分析程式碼使用形式及意義。
(開啟7組模型檔案並使用Notepad++按右鍵開啟程式碼)
程式碼
*v開頭 >> vertex /*代表頂點*/
*vn開頭 >> vertex normal /*代表打光的法向量*/
*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主要的迴圈*/
}
*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主要的迴圈*/
}
沒有留言:
張貼留言