2019年5月30日 星期四

Week15 鍾嘉穎 2019-05-30

1. 主題: 攝影機、運鏡
      
1. 點進去小葉的網頁: http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/
      2. 下載 Example裏的 win32, glut32.dll, data, source
      3. 解壓縮到下載 (但先不要把souces .zip解壓縮)
      4. 把已解壓的 data 資料夾拉到windows裏
      5. 把已解壓的 glut32.dll 資料夾拉到windows裏
      6. 打開 Projection.exe

      7. 下方可以換投影機
       

      8. 垂直投影
       
       
       9. 透視投影
       

       10. Frustum 投影
     

     11. 不同參數的意義
     

2. 主題: 投影、矩陣
      1. 先載入freeglut (跟第一週一樣)
           1. Google search "freeglut windows"
           2. 從Transmission Zero 下載 "freeglut 3.0.0 MinGW Package"
           3. 解壓縮後放到桌面
           4. 在lib複製一個"libfreeglut.a"命名為"libglut32.a"
           5. CodeBlocks 開
           6. File  ->  New -> Project -> GLUT Project
           7. 把location改成"C:\Users\user\Desktop\freeglut"
      2. 點進去小葉的網頁: http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/
      3. 下載 Example裏的 source
      4. 把souces .zip解壓縮
      5. 把source裡的glm.h放到自己專案的資料夾裡
      6. 
把source裡的glm.c改成glm.cpp
      7. 在CodeBlocks裡把glm.cpp加到自己專案
      8. 用Notepad++打開source裡的Projection.c
      9. 把Projection.c的程式碼複製 貼到自己專案的main裡
      10. 把windows裡的data放到freeglut資料夾的bin裡

      

       11. 把以下程式碼打到main裡 (把摸型印出來(跟茶壺一樣))`
           #include <GL/glut.h>///GLUT 外掛
           #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
           GLMmodel * pmodel=NULL;///指標
           void drawmodel(void)
           {
               if (!pmodel) {
            pmodel = glmReadOBJ("data/al.obj");
            if (!pmodel) exit(0);
            glmUnitize(pmodel);
            glmFacetNormals(pmodel);
            glmVertexNormals(pmodel, 90.0);
               }

               glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
           }
           void display(void)
           {
               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
               drawmodel();
               glutSwapBuffers();
           }

           int main(int argc, char** argv)
           {
               glutInit(&argc, argv);
               glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
               glutInitWindowSize(512,512);
               glutInitWindowPosition(50, 50);
               glutCreateWindow("week15");
           
           //    glutReshapeFunc(reshape);
               glutDisplayFunc(display);

               glutMainLoop();

               return 0;
           }
           

       12. 把打光的程式碼加進去

              GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
              glEnable(GL_DEPTH_TEST);
      glEnable(GL_LIGHTING);
              glEnable(GL_LIGHT0);
              glLightfv(GL_LIGHT0, GL_POSITION, light_pos);


              #include <GL/glut.h>///GLUT 外掛
              #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
              GLMmodel * pmodel=NULL;///指標
              void drawmodel(void)
              {
                  if (!pmodel) {
               pmodel = glmReadOBJ("data/al.obj");
               if (!pmodel) exit(0);
               glmUnitize(pmodel);
               glmFacetNormals(pmodel);
               glmVertexNormals(pmodel, 90.0);
                  }

                  glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
              }
              void display(void)
              {
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                  drawmodel();
                  glutSwapBuffers();
              }

              int main(int argc, char** argv)
              {
                  glutInit(&argc, argv);
                  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
                  glutInitWindowSize(512,512);
                  glutInitWindowPosition(50, 50);
                  glutCreateWindow("week15");

              //    glutReshapeFunc(reshape);
                  glutDisplayFunc(display);
                  GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
                  glEnable(GL_DEPTH_TEST);
               glEnable(GL_LIGHTING);
                  glEnable(GL_LIGHT0);
                  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
                  glutMainLoop();
                  return 0;
              }

              

       13. 把旋轉的程式碼加進去

              #include <GL/glut.h>///GLUT 外掛
              #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
              GLMmodel * pmodel=NULL;///指標
              void drawmodel(void)
              {
                  if (!pmodel) {
               pmodel = glmReadOBJ("data/al.obj");
               if (!pmodel) exit(0);
               glmUnitize(pmodel);
               glmFacetNormals(pmodel);
               glmVertexNormals(pmodel, 90.0);
              }
                  glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
              }
              void display(void)
              {
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                  drawmodel();
                  glutSwapBuffers();
              }
              #include <math.h>///for sin() cos() ///NOW3
              float eyeX=0.5, eyeY=0, eyeZ=0; ///NOW3
              void timer(int t)///NOW3
              {
                  float angle = (t/180.0)*3.1415926; ///NOW3
                  eyeX=0.5*cos(angle); ///NOW3
                  eyeZ=0.5*sin(angle); ///NOW3

                  glutTimerFunc(33, timer, t+1);///NOW3
                  glMatrixMode(GL_MODELVIEW);///NOW3
                  glLoadIdentity();///NOW3
                  gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
                          0, 0, 0,///center ///NOW3
                             0, 1, 0);///up    ///NOW3
              
                  glutPostRedisplay();///NOW3
              }
              int main(int argc, char** argv)
              {
                  glutInit(&argc, argv);
                  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
                  glutInitWindowSize(512,512);
                  glutInitWindowPosition(50, 50);
                  glutCreateWindow("week15");
              //    glutReshapeFunc(reshape);
                  glutDisplayFunc(display);
                  glutTimerFunc(33, timer, 0);///NOW3
              
                  GLfloat light_pos[] = { 0.0, 0.0, -1.0, 0.0 };
                  glEnable(GL_DEPTH_TEST);
               glEnable(GL_LIGHTING);
                  glEnable(GL_LIGHT0);
                  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);

                  glutMainLoop();

                  return 0;
              }

              


       14. 調整相機(不會壞掉)

              #include <GL/glut.h>///GLUT 外掛
              #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
              GLMmodel * pmodel=NULL;///指標
              void drawmodel(void)
              {
                  if (!pmodel) {
               pmodel = glmReadOBJ("data/al.obj");
               if (!pmodel) exit(0);
               glmUnitize(pmodel);
               glmFacetNormals(pmodel);
               glmVertexNormals(pmodel, 90.0);
                  }
                  glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
              }
              void display(void)
              {
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                  drawmodel();
                  glutSwapBuffers();
              }
              #include <math.h>///for sin() cos() ///NOW3
              float eyeX=0.5, eyeY=0, eyeZ=0; ///NOW3
              void timer(int t)///NOW3
              {

                  glMatrixMode(GL_PROJECTION); ///NOW4
                  glLoadIdentity(); ///NOW4
               glOrtho(-1, +1,  -1,+1, -10,+10); ///NOW4 你可以看到 -10...+10範圍


                  float angle = (t/180.0)*3.1415926; ///NOW3
                  eyeX=0.5*cos(angle); ///NOW3
                  eyeZ=0.5*sin(angle); ///NOW3

                  glutTimerFunc(33, timer, t+1);///NOW3
                  glMatrixMode(GL_MODELVIEW);///NOW3
                  glLoadIdentity();///NOW3
                  gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
                          0, 0, 0,///center ///NOW3
                             0, 1, 0);///up    ///NOW3
              
                  glutPostRedisplay();///NOW3
              }
              int main(int argc, char** argv)
              {
                  glutInit(&argc, argv);
                  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
                  glutInitWindowSize(512,512);
                  glutInitWindowPosition(50, 50);
                  glutCreateWindow("week15");
              //    glutReshapeFunc(reshape);
                  glutDisplayFunc(display);
                  glutTimerFunc(33, timer, 0);///NOW3

                  GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };
                  glEnable(GL_DEPTH_TEST);
               glEnable(GL_LIGHTING);
                  glEnable(GL_LIGHT0);
                  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
              
                  glutMainLoop();

                  return 0;
              }
              

       14. 調整不同的角度(遠看、近看等等)

              #include <GL/glut.h>///GLUT 外掛
              #include "glm.h"///glm.cpp for 3D model glmReadOBJ(), glmDraw(), glmUnitized()
              GLMmodel * pmodel=NULL;///指標
              void drawmodel(void)
              {
                  if (!pmodel) {
               pmodel = glmReadOBJ("data/al.obj");
               if (!pmodel) exit(0);
               glmUnitize(pmodel);
               glmFacetNormals(pmodel);
               glmVertexNormals(pmodel, 90.0);
                  }
                  glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
              }
              void display(void)
              {
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                  drawmodel();
                  glutSwapBuffers();
              }
              #include <math.h>///for sin() cos() ///NOW3
              float eyeX=2, eyeY=0, eyeZ=0; ///NOW3
              void timer(int t)///NOW3
              {

                  glMatrixMode(GL_PROJECTION); ///NOW4
                  glLoadIdentity(); ///NOW4
               ///glOrtho(-1, +1,  -1,+1, -10.0,10.0); ///NOW4 你可以看到 -10...+10範圍
               gluPerspective(60, 1.0, 0.001, 1000);///NOW5

                  float angle = (t/180.0)*3.1415926; ///NOW3
                  eyeX=2*cos(angle); ///NOW3
                  eyeZ=2*sin(angle); ///NOW3

                  glutTimerFunc(33, timer, t+1);///NOW3
                  glMatrixMode(GL_MODELVIEW);///NOW3
                  glLoadIdentity();///NOW3
                  gluLookAt( eyeX, eyeY, eyeZ,///eye ///NOW3
                          0, 0, 0,///center ///NOW3
                             0, 1, 0);///up    ///NOW3

                  glutPostRedisplay();///NOW3
              }
              int main(int argc, char** argv)
              {
                  glutInit(&argc, argv);
                  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE);
                  glutInitWindowSize(512,512);
                  glutInitWindowPosition(50, 50);
                  glutCreateWindow("week15");
              //    glutReshapeFunc(reshape);
                  glutDisplayFunc(display);
                  glutTimerFunc(33, timer, 0);///NOW3

                  GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };
                  glEnable(GL_DEPTH_TEST);
               glEnable(GL_LIGHTING);
                  glEnable(GL_LIGHT0);
                  glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
                            
                  glutMainLoop();

                  return 0;
              }

              


沒有留言:

張貼留言