一.
先從jsyeh.org/3dcg10 下載 data.zip , windows.zip
data.zip =>下載/windows/data
windows.zip => 下載/windows
source.zip=>下載/windows
執行windows/LightMaterial.exe
二.
開啟一個新專案,命名為week08_model,從week06_light複製到這周的main.cpp
1.source.zip裡面有三個程式 glm.h glm.c. lightmaterial.cpp
拿裡面的程式來用 便能讀入3D模型
2.
glm.c 改名成glm.cpp 並加入到CodeBlock中的week08_model
3. 將data放在desktop/freeglut/bin裡面
4. 將glm.h 、 glm.cpp 放到week08_model資料夾中
///
#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();///否則卡在這裡,之後的程式,都不會執行到
}
///
三.
新增以下程式碼
///
#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模型的程式碼
///
將茶壺刪掉後新增程式碼,完成今天的程式碼
///
#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();///否則卡在這裡,之後的程式,都不會執行到
}
沒有留言:
張貼留言