2021年4月7日 星期三

築損 Week07

 第七週

第0部份

執行結果





-----------------------------------------------------------------------------------------------------------------------------

第1部份

開啟texture

CodeBlocks Settings Compiler 設定

圖檔要放在freeglut/lib

程式碼

#include <opencv/highgui.h> int main(int argc, char** argv) { IplImage*img=cvLoadImage("bear.jpg"); cvShowImage("bear",img); cvWaitKey(0); }









下一步

把圖丟進茶壺

程式碼

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> void init() { IplImage * img = cvLoadImage("bear.jpg"); ///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); } ///最後一行最難/最重要, 所貼圖影像的資料都設定好 void display() { glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);///清空 glutSolidTeapot(0.3); glutSwapBuffers(); } int main(int argc, char *argv[])///main()函式 { glutInit(&argc, argv);///(1)Init初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///(2)Init初始化 Display 的功能 glutCreateWindow("08160075 吳英昭");///(3)建立GLUT視窗 glutDisplayFunc(display);///(4)準備display()函式 glutIdleFunc(display);///TODO 重看畫面 init(); glutMainLoop();///(5)主要程式 }















下一步

執行結果











-----------------------------------------------------------------------------------------------------------------------------

第2部份

最後釘上釘子

程式碼

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> void init() { IplImage * img = cvLoadImage("bear.jpg"); ///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); } ///最後一行最難/最重要, 所貼圖影像的資料都設定好 void display() { glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);///清空 glBegin(GL_POLYGON); glTexCoord2f(0,1);glVertex2f(-1,-1); glTexCoord2f(1,1);glVertex2f(1,-1); glTexCoord2f(1,0);glVertex2f(1,1); glTexCoord2f(0,0);glVertex2f(-1,1); glEnd(); glutSolidTeapot(0.3); glutSwapBuffers(); } int main(int argc, char *argv[])///main()函式 { glutInit(&argc, argv);///(1)Init初始化GLUT glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///(2)Init初始化 Display 的功能 glutCreateWindow("08160075 吳英昭");///(3)建立GLUT視窗 glutDisplayFunc(display);///(4)準備display()函式 glutIdleFunc(display);///TODO 重看畫面 init(); glutMainLoop();///(5)主要程式 }

執行結果




-----------------------------------------------------------------------------------------------------------------------------

第3部份

地球

程式碼

#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> GLUquadric * quad;///TODO: Quad void init()///copy 自 http://hackmd.io/@jsyeh/opengl { IplImage * img = cvLoadImage("bear.jpg"); ///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); quad = gluNewQuadric();///TODO: Quad } ///最後一行最難/最重要, 所貼圖影像的資料都設定好 float angle=0;///TODO: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();///自動轉很帥///TODO: glRotatef(90, 1,0,0);///TODO: glRotatef(angle, 0,0,1);///自動轉很帥///TODO: gluQuadricTexture(quad, 1);///TODO: gluSphere(quad, 0.5, 30, 30);///glutSolidTeapot(0.3);///TODO: glPopMatrix();///自動轉很帥///TODO: ///glutSolidTeapot(0.3); glutSwapBuffers(); angle++;///TODO: } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("week07 texture"); glutDisplayFunc(display); glutIdleFunc(display);///TODO: glEnable(GL_DEPTH_TEST);///TODO: 有3D的深度測試(前面會蓋掉後面) init();///上面把OpenGL都設好後, 才設定 OpenCV 的貼圖到 OpenGL上面 glutMainLoop(); }

執行結果



-----------------------------------------------------------------------------------------------------------------------------


沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...