1. 貼圖
step1: 安裝 OpenCV-2.1,要加 PATH (第二個),用預設目錄
step2: 重開 CodeBlocks ,設定貼圖的3個設定 Settings-Compiler
setp3: 在 Search directories 加入2個目錄
Compiler 👉 C:\OpenCV2.1\include
Linker 👉 C:\OpenCV2.1\lib
step4: 在 Linker setting 裡,加入 👉 cv210
👉 cxcore210
👉 highgui210
step5: 開空白檔案,檔案名稱 "week05-1_opencv.cpp"
step6: 寫程式碼 👉 #include <opencv/highgui.h>
int main()
{
///大寫I,小寫pl (Intel performance library)
IplImage * img = cvLoadImage("c:/micky.jpg");
///大寫的Image 圖檔請放在 c:跟目錄裡,micky.jpg
cvShowImage("week05 micky", img);
///秀圖(兩個參數不確定)
cvWaitKey(0); ///等任意鍵,再繼續
}
2. 下載課本範例,https://jsyeh.org/3dcg10/ 👉 [data][win32]
step2: 跑範例,觀察 👇
glBegin(...);
glTexCoord2f(tx, ty); glVertex2f(x, y);
glTexCoord2f(tx2, ty2); glVertex2f(x2, y2);
glTexCoord2f(tx3, ty3); glVertex2f(x3, y3);
glTexCoord2f(tx4, ty4); glVertex2f(x4, y4);
glEnd();
3. 將米老鼠和茶壺同時從小黑式窗叫出
step1: 下載 freeglut-MinGW-3.0.0-1.mp.zip
step2: 進到資料夾,把檔案 freeglut 拉到桌面
step3: 點進 freeglut 👉 lib 資料夾
step4: 複製 libfreeglut.a 並且改名為libglut32.a
step5: 新增專案,專案名稱 "week05-1_texture_opencv_cvLoadImage"
step6: 將十行程式碼貼上
step7: 再加上1. 的三行程式碼,變成以下程式碼 👇
#include <GL/glut.h>
#include <opencv/highgui.h>
void display()
{
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
IplImage * img = cvLoadImage("c:/micky.jpg");
cvShowImage("opencv", img);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05-1 texture opency");
glutDisplayFunc(display);
glutMainLoop();
}
4. 結合 👉 茶壺和地球平面圖
step1: 新增專案,專案名稱 "week05-2_texture_teapot_earth"
step2: 修改、增加、剪貼18行貼圖的程式碼程式碼 👉
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
///老師給的程式碼
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 display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05 texture");
glutDisplayFunc(display);
myTexture("C:/earth.jpg"); ///下載的地球平面圖
glutMainLoop();
}
5. 貼地球平面圖
step1: 新增專案,專案名稱 "week05-3_texture_polygon"
step2: 複製 "week05-2_texture_teapot_earth" 的程式碼
step3: 修改display的函式 👉
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_POLYGON);
glTexCoord2f(0, 0); glVertex2f(-1, -1);
glTexCoord2f(1, 0); glVertex2f(1, -1);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(-1, 1);
glEnd();
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
step4: 修改,地球上下矯正
glTexCoord2f(0, 0); glVertex2f(-1, 1);
glTexCoord2f(1, 0); glVertex2f(1, 1);
glTexCoord2f(1, 1); glVertex2f(1, -1);
glTexCoord2f(0, 1); glVertex2f(-1, -1);
6. 旋轉茶壺
step1: 新增專案,專案名稱 "week05-4_texture_earth_rotating"
step2: 貼上10行程式碼,加上18行的貼圖程式碼(4. step2)
step3: 加上3行程式碼
display 前 👉 float angle = 0; ///要有個旋轉的角度
display 👉 glEnable(GL_DEPTH_TEST); ///開啟3D的功能(深度測試)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle++, 0, 1, 0);
glPopMatrix();
main 👉 glutIdleFunc(display);
7. 地球旋轉
step1: 直接修改 "week05-4_texture_earth_rotating" 的程式碼
display 前 👉 GLUquadric * quad = NULL; ///用來畫地球的quad二次曲面
display 修 👉 glPushMatrix();
glRotatef(90, 1, 0, 0);
glRotatef(angle++, 0, 0, 1);
gluSphere(quad, 1, 30, 30);
glPopMatrix();
glutSwapBuffers();
main 👉 quad = gluNewQuadric();
gluQuadricTexture(quad, 1);
沒有留言:
張貼留言