2020年5月20日 星期三

week13


把codeblocks的專案檔week13.cbp,用Notepad++修改他的working.dir變成小數點,
再把freeglut的bin中的freeglut.dll複製一分到week13目錄裡,便可以執行
  • 專案檔裡的[bin][obj]資料夾是什麼?
    • [obj]資料夾裡有[main.o],[bin]資料夾裡有[week13.exe]
      關係如下:
    • [main.cpp]先變成⭆[main.o]再變⭆[week13.exe]
    • 結論:可以刪除!!再次執行build時,會自動生成這兩個資料夾
  • 為什麼檔案(圖檔、音檔)都必須放到[freeglut\bin]?很奇怪!!
    • 原因:
      • 因為需要[freeglut.dll]
    • 解決方法:
      • NotePab++開啟專案檔裡的CBP檔
      • 找到2"C:\Users\Administrator\Desktop\freeglut\bin"改成"."
        • 小數點(.) = 現在的目錄
      • [freeglut.dll]複製進專案資料夾以後都能自給自足了
➽試著再改造完的執行目錄裡放入模型並成功讀取
  • 模型檔(.obj和.mtl)拉入專案資料夾裡,跟[freeglut.dll]同層
  • 改寫程式碼
    • #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("al.obj");
    •            glmUnitize(model);
    •            glmFacetNormals(model);
    •            glmVertexNormals(model, 90);
    •     }
    •     glPushMatrix();
    •         glRotatef(180,0,1,0);//轉正
    •         glmDraw(model,GLM_SMOOTH|GLM_MATERIAL);
    •     glPopMatrix();
    •     glutSwapBuffers();
    • }
    • int main(int argc, char *argv[])
    • {
    •     glutInit(&argc, argv);
    •     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    •     glutCreateWindow("week13");
    •     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();
    • }
    • 成功

      複習上禮拜的打光OBJ模型



      #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("Al.obj");
              glmUnitize(model);

              glmFacetNormals(model);

              glmVertexNormals(model,90);
              
          }
           glPushMatrix();

              glRotatef(180,0,1,0);

              glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);

          glPopMatrix();

          glutSwapBuffers();
      }
      int main(int argc, char *argv[])
      {
          glutInit(&argc, argv);
          glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

          glutCreateWindow("Week13");

          glutDisplayFunc(display);

          
          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();
      }


      打光OBJ模型 延伸

      (多出了保時捷模型透過滑鼠轉動)



      #include <GL/glut.h>
      #include "glm.h" 
      GLMmodel * model=NULL;
      GLMmodel * model2=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 };
                                                 光的位置,z調正負 
      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 drawBody()移出來變函式
      {
          if(model==NULL){
              model = glmReadOBJ("Al.obj");
              glmUnitize(model);
              glmFacetNormals(model);重算(面)法向量
              glmVertexNormals(model, 90);重算(頂點vn)法向量
          }
          glPushMatrix();
              glScalef(0.8, 0.8, 0.8);
              glRotatef(180, 0,1,0);對Y軸轉180度
              glmDraw(model, GLM_SMOOTH | GLM_MATERIAL);
          glPopMatrix();///TODO4:
      }
      void drawArm()///TODO5: 
      {
          if(model2==NULL){///TODO5:
              model2 = glmReadOBJ("porsche.obj");///TODO5:
              glmUnitize(model2);大太了,就縮小 -1...+1
          }
          glPushMatrix();
              glScalef(0.2, 0.2, 0.2);
              glRotatef(90, 0,1,0);
              glmDraw(model2,  GLM_SMOOTH | GLM_MATERIAL);
          glPopMatrix();
      }
      float angle=0;
      void display()
      {
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
          drawBody(); 移出來變函式
          glPushMatrix();
              glTranslatef(0.3, 0.3, 0); (3)等一下要掛在哪裡
              glRotatef(angle, 0,0,1); (1) 有個轉動
              glTranslatef(0.2, 0, 0); (2) 移動轉動的中心
              drawArm();新讀入的模型
          glPopMatrix();
          glutSwapBuffers();
      }
      void motion(int x, int y)
      {
          angle = x;
          glutPostRedisplay();
      }
      int main(int argc, char *argv[])
      {
          glutInit(&argc, argv);
          glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);

          glutCreateWindow("Week13");

          glutDisplayFunc(display);
          glutMotionFunc(motion);新增函式

          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();

      }



沒有留言:

張貼留言