2020年4月29日 星期三

(*^ω^*) 喵~Week10

➽上課小考

  • 複習:T-R-T (像關節一樣的)轉動
    • 使用老師給的小程式試試
➽ Time計時器

  • 因為glutIdleFunc(idle);是有空的時候就做,導致不同的電腦執行速度不同
  • 改正:
    • 設一個timer()函式⤵
      • void timer(int t)//t是第幾張圖
      • {
      •     glutTimerFunc(33,timer,t+1);
      •     //33ms*33ms=1000ms=1s,33ms表示1秒跑30-33張圖
      •     glutPostRedisplay();
      • }
    • 將glutIdleFunc(idle);改成glutTimerFunc(2000,timer,0);//設定第1個timer,等2秒在動畫(1000ms=1s),0是參數
    • 2秒後開始轉動
➽貼圖(多張)
  • OpenCV2.1裝起來並設定好(參考Week07)
  • 將老師給的程式碼貼上
  • 找一張世界地圖放在C:\Users\Administrator\Desktop\freeglut\bin
  • 安裝好OpenCV 2.1之後,要重開CodeBlocks(沒重開CodeBlocks會出現 dll錯誤)
    • #include <opencv/highgui.h> ///for cvLoadImage()
    • #include <opencv/cv.h> ///for cvCvtColor()
    • #include <GL/glut.h> ///3D glut
    • #include <stdio.h>
    • GLUquadric * quad;
    • GLuint id;
    • float angle=0;
    • void display()
    • {  
    •     glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    •     glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    •     glPushMatrix();///自動轉很帥
    •         glRotatef(90, 1,0,0);
    •         glRotatef(angle, 0,0,1);///自動轉很帥
    •         gluQuadricTexture(quad, 1);
    •         gluSphere(quad, 1, 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("image.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> 
    • #include <stdio.h>
    • GLUquadric * quad;
    • GLuint id,idmoon,idsky;///要記得宣告
    • float angle=0;
    • void display()
    • {
    •     glEnable(GL_DEPTH_TEST); 
    •     glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    •     glBindTexture(GL_TEXTURE_2D, idsky);///綁定bind 貼圖ID
    •     glBegin(GL_POLYGON);///背景
    •         glTexCoord2f(0,0); glVertex2f(-1,+1);///貼圖座標+頂點(可參考Week03作業)
    •         glTexCoord2f(0,1); glVertex2f(-1,-1);
    •         glTexCoord2f(1,1); glVertex2f(+1,-1);
    •         glTexCoord2f(1,0); glVertex2f(+1,+1);
    •     glEnd();
    •     glPushMatrix();///第一顆球體(月亮)
    •         glTranslatef(0.6,0,0);
    •         glRotatef(90, 1,0,0);
    •         glRotatef(angle, 0,0,1);
    •         glBindTexture(GL_TEXTURE_2D, idmoon); ///綁定bind 貼圖ID
    •         gluQuadricTexture(quad, 1);
    •         gluSphere(quad, 0.3, 30, 30);//0.3是半徑
    •     glPopMatrix();
    •     glPushMatrix();///第二顆球體(地球)
    •         glRotatef(90, 1,0,0);
    •         glRotatef(angle, 0,0,1);
    •         glBindTexture(GL_TEXTURE_2D, id);///綁定bind 貼圖ID
    •         gluQuadricTexture(quad, 1);
    •         gluSphere(quad, 0.3, 30, 30);
    •     glPopMatrix();
    •     glFlush();
    • }
    • void timer(int t)
    • {
    •     glutTimerFunc(20, timer, 0);
    •     angle+=1;
    •     glutPostRedisplay();
    • }
    • int myTexture(char *filename)
    • {
    •     IplImage * img = cvLoadImage(filename); 
    •     cvCvtColor(img,img, CV_BGR2RGB); 
    •     glEnable(GL_TEXTURE_2D);
    •     GLuint id; 
    •     glGenTextures(1, &id); 
    •     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    •     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    •     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("image.jpg");///圖1(地球)
    •     idmoon = myTexture("image_moon.jpg");///圖2(月亮)
    •     idsky = myTexture("image_sky.jpg");///圖3(星空)
    • ///圖要放在C:\Users\Administrator\Desktop\freeglut\bin
    • }
    • int main(int argc, char**argv)
    • {
    •     glutInit(&argc, argv);
    •     glutCreateWindow("3D");
    •     glutDisplayFunc(display); 
    •     glutTimerFunc(0, timer, 0);
    •     myInit(); 
    •     glutMainLoop();
    • }
⧪終止貼圖~
  • 如果不想將貼圖用在下一個物件上,可以這樣做⤵
    •     glEnable(GL_TEXTURE_2D);//開啟貼圖程式
    •     glColor3f (1,1,1);//將背景設為白色
    •     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();
    •     glDisable(GL_TEXTURE_2D);//關閉貼圖程式
    • 成果

沒有留言:

張貼留言