2020年5月6日 星期三

(*^ω^*) 喵~Week11

➽ MAYA OBJ 模型檔
  • 網址:http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/
  • 下載  [source][data][win32][glut32.dll]
  • [windows]解壓縮>>開啟[windows]資料夾>>將[data]壓縮裡的資料夾和[glut32.dll]拉入[windows]資料夾
  • 點開 [data] 資料夾 >> 找一個OBJ檔Notepad++觀看
    • v 頂點
    • vn 法向量
    • vt 貼圖
    • f 面(facet)
  • 了解 glm
    • #include "glm.h" //使用外掛,glm的外掛(glm.h 配 glm.c)
    • GLMmodel* pmodel = NULL; //指標,指到資料結構OBJ模型
➽自己做出 Transformation
  • 開啟一個 glut 檔案
  • [transformation.c] 全部複製過來
  • [glm.c]更改為[glm.cpp]
  • [glm.cpp][glm.h]拉到與專案同一層(圖一)
  • 在codeblocks裡加入[glm.cpp](圖二)(圖三)
  • 最後將[data]資料夾放到[freeglut]>>[bin]
      圖一
      圖二
      圖三
      成果
      小技巧

➽親手打造程式
  • 複製之前的架構,再加入一點東西
    • #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);//怕模型太大太小,改成Unit單位(-1~+1)
    •          glmFacetNormals(model);//計算facet的法向量(多個)
    •          glmVertexNormals(model, 90);//計算vertex的法向量(多個)
    •     }
    •     glmDraw(model,GLM_SMOOTH|GLM_MATERIAL);//畫圖
    •     glutSwapBuffers();
    • }
    • int main(int argc, char *argv[])
    • {
    •     glutInit(&argc, argv);
    •     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    •     glutCreateWindow("親手打造");
    •     glutDisplayFunc(display);
    •     glutMainLoop();
    • }
      成果
  • 加入打光~~
    • #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_DOUBLE | GLUT_DEPTH);

    •     glutCreateWindow("親手打造");
    •     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_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();
    • }
    • 燈燈~有種神秘感~背光了
    • 改變背光
      • const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };
      • 出現了~阿呀!怎麼是背對的
    • 轉正面
      • glPushMatrix();
      •         glRotatef(180,0,1,0);//轉180度,向前~看~
      •         glmDraw(model,GLM_SMOOTH|GLM_MATERIAL);
      • glPopMatrix();
      • 揭開神秘面紗~

    沒有留言:

    張貼留言