前往http://jsyeh.org/3dcg10
1. data.zip按滑鼠右鍵另存新檔
2. windows.zip按滑鼠右鍵另存新檔
3. glut32.dll按滑鼠右鍵另存新檔
4. sourse.zip
5. 將windows.zip解壓縮到桌面 →data.zip解壓縮到windows.zip資料夾
→glut32.dll複製到windows.zip資料夾 →將Transformation點兩下
6.切換模型
- v開頭 vertex
- vn開頭 vertex normal
- vt開頭 vertex texture coordinate
- f開頭 face臉.面
作業二: 製作.匯出3D obj檔
1.先開啟Maya→建一個模型→Window/Setting/Preferences/Plug-in Manager
2.objExport.mtl→將Auto load打勾
3.File→Export All...
4.將檔案類型改成OBJexport
5. 桌面上就會出現剛匯出的兩個檔案mtl檔和obj檔
作業三:
1.用老師的myGLMsample.zip解壓縮至桌面
→開啟CodeBlocks→File/Open...
→myGLMsample→04160011_hw1.cbp
2.Build and Run→跑出一台會轉動的保時捷
完整程式碼:
#include <string.h>
#include <stdlib.h>
#include <GL/glut.h>
#include "glm.h"
GLMmodel* pmodel = NULL;///一開始沒有讀入模型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/mushroom.obj");///檔名拼字目錄要對
if (!pmodel) exit(0);///讀完還是沒有? 太糟了 失敗就閃退
glmUnitize(pmodel);///如果沒有這行 可能太大或太小 看不到
///如果你的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
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);
glutMainLoop();///GLUT主要的迴圈
}
3.試著將自己做好的模型在CodeBlocks中顯示
→先把作業二中匯出的兩個檔案放進myGLMsample資料夾/data中
4. 更改部分程式碼:
pmodel = glmReadOBJ("data/porsche.obj");
→改成pmodel = glmReadOBJ("data/mushroom.obj");
即可出現會轉動的蘑菇
沒有留言:
張貼留言