step 0 :下載模型
0.0 jsyeh.org/3dcg10 下載 data.zip , windows.zip
0.1 data.zip =>下載/windows/data
windows.zip => 下載/windows
source.zip=>下載/windows
執行windows/LightMaterial.exe
step 1 : 複製程式碼
1.1 開啟新專案,命名為week08_model ,複製程式碼到notepad++,存檔成.cpp
讓字體變彩色好辨識
1.2從blogger的week06文章中複製light的程式碼並複製到week08_model
打開會看到黃色的茶壺
step 2 : 更名 、 放資料夾
2.1 source.zip裡面有三個程式 glm.h glm.c. lightmaterial.cpp
拿裡面的程式來用 便能讀入3D模型
2.2 glm.h 要使用當標題檔
glm.c 改名成glm.cpp 並加入到CodeBlock中的week08_model
2.3 將data放在desktop/freeglut/bin裡面
2.4 將glm.h 、 glm.cpp 放到week08_model資料夾中
step 3 : 解釋 、 過程
3.1 #include <stdio.h> /// < >是系統include裡的
3.2 #include "glm.h" ///雙引號是同目錄裡的檔案
3.3 GLMmodel* pmodel = NULL ///指標指到GLMmodel模型的指標
step 4 : 貼上程式碼
4.1貼上week06_light的程式碼
#include <GL/glut.h>
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 }; /// -5.0f是亮的 , 5.0是暗的
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 };
void display()///茶壺
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
int main(int argc, char **argv )
{
glutInit( &argc , argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" week06 light");
glutDisplayFunc(display);
///留下的程式碼 , 要放在glutCreateWindow後才會有效
glEnable(GL_DEPTH_TEST);
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()之前
glutMainLoop();///否則卡在這裡,之後的程式,都不會執行到
}
4.2新增程式碼
#include "glm.h"
GLMmodel*pmodel=NULL;
void
drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/soccerball.obj");///或是 data/data/soccerball.obj
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH);
}///用來畫3d模型的程式碼
4.3將茶壺刪除後新增drawmodel ,完成最終程式碼
#include <GL/glut.h>
#include "glm.h"
GLMmodel *pmodel = NULL;
void
drawmodel(void)
{
if(!pmodel) {
pmodel=glmReadOBJ("data/data/soccerball.obj");
if(!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel,90.0);
}
glmDraw(pmodel,GLM_SMOOTH);
}
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 }; /// -5.0f是亮的 , 5.0是暗的
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 };
void display()///茶壺
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3f(1,1,0);
///glutSolidTeapot(0.3);
drawmodel();///執行上面drawmodel函式
glutSwapBuffers();
}
int main(int argc, char **argv )
{
glutInit( &argc , argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow(" week06 light");
glutDisplayFunc(display);
///留下的程式碼 , 要放在glutCreateWindow後才會有效
glEnable(GL_DEPTH_TEST);
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()之前
glutMainLoop();///否則卡在這裡,之後的程式,都不會執行到
}
step 5 : 最後程式流程 、 問題
5.1.用哪行程式碼 ? drawmodel()
5.2.檔案在哪裡 ? 要放在working dir工作目錄裡
5.3.在CodeBlocks下方藍色Build log說我們的工作目錄在...
5.4.將data放在desktop/freeglut/bin裡面
5.5.在source/裡找到glm.c和glm.h (詳細資料中點選附檔名顯示.c和.h)
5.6.將glm.c改成glm.cpp
5.7.glm.cpp和glm.h放到CodeBlock中week08_model裡面
5.8.CodeBlocks裡面week8_model中add glm.cpp
5.9.執行完會有黃色足球
沒有留言:
張貼留言