電腦圖學 學習日誌
week11
- 主題: OBJ 模型
- 主題: 利用glm讀入OBJ模型
- 進階: OBJ檔、貼圖座標
- 確認作業3(簡單機器手臂)繳交狀況
(一)OBJ模型
下載: source、data、win32、glut32.dll
在data中開啟一個obj檔(Notepad++),了解OBJ檔的內容架構

(二)運用範例建立自己的程(OBJ檔、貼圖座標)
從source開啟3個檔:glm.h、glm.c、transformation.c
- 新建一個glut專案 ex:week11-1
- 將glm.h與glm.c檔放到week11-1專案資料夾
- 改glm.c為glm.cpp
- 將glm.cpp →add加入project裡
- 把下載下來的data放入freeglut的bin資料夾中

(三)自己寫一個glut程式入模型
#include <GL/glut.h>
#include "glm.h"
GLMmodel * model=NULL;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
if(model == NULL) model = glmReadOBJ("data/Al.obj");
glmUnitize(model);
glmFacetNormals(model);
glmVertexNormals(model,90);
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL );
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
glutCreateWindow("week11親手打造");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

(四)加入打光效果
#include <GL/glut.h>
#include "glm.h"
GLMmodel * model=NULL;
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 };
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
if(model == NULL) model = glmReadOBJ("data/Al.obj");
glmUnitize(model);
glmFacetNormals(model);
glmVertexNormals(model,90);
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL );
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
glutCreateWindow("week11親手打造");
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
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();
return 0;
}

修改display();程式部分
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
if(model == NULL){
model = glmReadOBJ("data/Al.obj");
glmUnitize(model);
glmFacetNormals(model);
glmVertexNormals(model,90);
}
glPushMatrix();
glRotatef(180,0,1,0);
glmDraw(model, GLM_SMOOTH | GLM_MATERIAL );
glPopMatrix();
glutSwapBuffers();
}
沒有留言:
張貼留言