2020年4月29日 星期三

Week10 - 07161045

複習T-R-T
  • 先複習今日小考以及上次所教的範圍
  • 老師很用心地寫了一個程式碼,讓我們更了解T-R-T的用法
     

Timer計時器
  • 先打開GLUT New Project
  • 在126行新增三行程式碼
void timer(int t)
    {
          glutTimerFunc(33, timer, t+1);
            glutPostRedisplay();
          }

          • 把"glutKeyboardFunc(key);"下的"glutIdleFunc(idle);"改成"glutTimerFunc( 2000, timer, 0);"
          • 執行後,圖片將等2秒後開始,程式碼中(1000ms = 1s)
          貼圖

          • 先下載OpenCV,並重新開啟CodeBlocks
          • 將老師給的貼圖程式碼複製到新開啟的CodeBlocks
          • 到Setting裡Compiler的Linker Setting新增cv210、cxcore210、highgui210
          • 再到Search directories裡的Compiler新增C:\OpenCV2.1\include,再到Linker新增C:\OpenCV2.1\lib
          • 上網找一張照片存在freeglut裡的bin,命名為"image.jpg"
               
          • 製作出兩顆貼圖球
          • 程式碼如下:
          #include <opencv/highgui.h>
            #include <opencv/cv.h>
              #include <GL/glut.h>
                GLUquadric * quad;
                  GLuint id,id2;///新增id
                    float angle=0;
                      void display()
                        {   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
                              glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
                                  glPushMatrix();///left
                                        glTranslatef(-0.6,0,0);
                                          glRotatef(90, 1,0,0);
                                            glRotatef(angle, 0,0,1);
                                              glBindTexture(GL_TEXTURE_2D, id);///綁貼圖
                                                gluQuadricTexture(quad, 1);
                                                  gluSphere(quad, 0.4, 30, 30);///glutSolidTeapot(0.3);
                                                glPopMatrix();
                                                  glPushMatrix();///right
                                                        glTranslatef(0.6,0,0);
                                                          glRotatef(90, 1,0,0);
                                                            glRotatef(angle, 0,0,1);
                                                              glBindTexture(GL_TEXTURE_2D, id2);///綁貼圖
                                                                gluQuadricTexture(quad, 1);
                                                                  gluSphere(quad, 0.4, 30, 30);///glutSolidTeapot(0.3);
                                                                glPopMatrix();
                                                                  glFlush();
                                                                }
                                                                  void timer(int t)
                                                                    {   glutTimerFunc(20, timer, 0);/// 1000 msec   50fps:20msec
                                                                          angle+=1;
                                                                            glutPostRedisplay();
                                                                          }
                                                                            int myTexture(char *filename)
                                                                              {
                                                                                    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
                                                                                      cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
                                                                                        glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
                                                                                          GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
                                                                                            glGenTextures(1, &id); /// 產生Generate 貼圖ID
                                                                                              glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
                                                                                                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
                                                                                                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
                                                                                                    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
                                                                                                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
                                                                                                        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
                                                                                                          return id;
                                                                                                        }

                                                                                                            void myInit()
                                                                                                              {   quad = gluNewQuadric();
                                                                                                                    id = myTexture("imaged.jpg");
                                                                                                                      id2 = myTexture("image2.jpg");
                                                                                                                    }
                                                                                                                      int main(int argc, char**argv)
                                                                                                                        {   glutInit(&argc, argv);
                                                                                                                              glutCreateWindow("3D");
                                                                                                                                glutDisplayFunc(display); ///顯示
                                                                                                                                  glutTimerFunc(0, timer, 0);
                                                                                                                                    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
                                                                                                                                      glutMainLoop();
                                                                                                                                    }
                                                                                                                                         
                                                                                                                                    • 製作出背景圖案
                                                                                                                                    • 程式碼如下:
                                                                                                                                    #include <opencv/highgui.h>
                                                                                                                                      #include <opencv/cv.h>
                                                                                                                                        #include <GL/glut.h>
                                                                                                                                          GLUquadric * quad;
                                                                                                                                            GLuint id,id2;///新增id
                                                                                                                                              float angle=0;
                                                                                                                                                void display()
                                                                                                                                                  {   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
                                                                                                                                                        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
                                                                                                                                                          glBindTexture(GL_TEXTURE_2D, id);///綁背景貼圖
                                                                                                                                                            glBegin(GL_POLYGON);
                                                                                                                                                                  glTexCoord2f(0,0); glVertex2f(-1,+1);
                                                                                                                                                                    glTexCoord2f(0,1); glVertex2f(-1,-1);
                                                                                                                                                                      glTexCoord2f(1,1); glVertex2f(+1,-1);
                                                                                                                                                                        glTexCoord2f(1,0); glVertex2f(+1,+1);
                                                                                                                                                                      glEnd();
                                                                                                                                                                        glPushMatrix();///left
                                                                                                                                                                              glTranslatef(-0.6,0,0);
                                                                                                                                                                                glRotatef(90, 1,0,0);
                                                                                                                                                                                  glRotatef(angle, 0,0,1);
                                                                                                                                                                                    glBindTexture(GL_TEXTURE_2D, id);///綁貼圖
                                                                                                                                                                                      gluQuadricTexture(quad, 1);
                                                                                                                                                                                        gluSphere(quad, 0.4, 30, 30);///glutSolidTeapot(0.3);
                                                                                                                                                                                      glPopMatrix();
                                                                                                                                                                                        glPushMatrix();///right
                                                                                                                                                                                              glTranslatef(0.6,0,0);
                                                                                                                                                                                                glRotatef(90, 1,0,0);
                                                                                                                                                                                                  glRotatef(angle, 0,0,1);
                                                                                                                                                                                                    glBindTexture(GL_TEXTURE_2D, id2);///綁貼圖
                                                                                                                                                                                                      gluQuadricTexture(quad, 1);
                                                                                                                                                                                                        gluSphere(quad, 0.4, 30, 30);///glutSolidTeapot(0.3);
                                                                                                                                                                                                      glPopMatrix();
                                                                                                                                                                                                        glFlush();
                                                                                                                                                                                                      }
                                                                                                                                                                                                        void timer(int t)
                                                                                                                                                                                                          {   glutTimerFunc(20, timer, 0);/// 1000 msec   50fps:20msec
                                                                                                                                                                                                                angle+=1;
                                                                                                                                                                                                                  glutPostRedisplay();
                                                                                                                                                                                                                }
                                                                                                                                                                                                                  int myTexture(char *filename)
                                                                                                                                                                                                                    {
                                                                                                                                                                                                                          IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
                                                                                                                                                                                                                            cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
                                                                                                                                                                                                                              glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
                                                                                                                                                                                                                                GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
                                                                                                                                                                                                                                  glGenTextures(1, &id); /// 產生Generate 貼圖ID
                                                                                                                                                                                                                                    glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
                                                                                                                                                                                                                                      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
                                                                                                                                                                                                                                        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
                                                                                                                                                                                                                                          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
                                                                                                                                                                                                                                            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
                                                                                                                                                                                                                                              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
                                                                                                                                                                                                                                                return id;
                                                                                                                                                                                                                                              }

                                                                                                                                                                                                                                                  void myInit()
                                                                                                                                                                                                                                                    {   quad = gluNewQuadric();
                                                                                                                                                                                                                                                          id = myTexture("imaged.jpg");
                                                                                                                                                                                                                                                            id2 = myTexture("image2.jpg");
                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                            int main(int argc, char**argv)
                                                                                                                                                                                                                                                              {   glutInit(&argc, argv);
                                                                                                                                                                                                                                                                    glutCreateWindow("3D");
                                                                                                                                                                                                                                                                      glutDisplayFunc(display); ///顯示
                                                                                                                                                                                                                                                                        glutTimerFunc(0, timer, 0);
                                                                                                                                                                                                                                                                          myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
                                                                                                                                                                                                                                                                            glutMainLoop();
                                                                                                                                                                                                                                                                          }
                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                                                                          沒有留言:

                                                                                                                                                                                                                                                                          張貼留言