➽ Time計時器
- 因為glutIdleFunc(idle);是有空的時候就做,導致不同的電腦執行速度不同
- 改正:
- 將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();
- }
![]() |
| 開出會轉動的地球 |
- 如果不想將貼圖用在下一個物件上,可以這樣做⤵




沒有留言:
張貼留言