week08
Texture 貼圖
事前提要:
1. 要注意電腦上的codeblocks上面是有裝圖學要用的MinGW編譯環境,並且將相關設定都設好
今日目標:做出一個會轉動的地球
試用:
先點進去老師的網站中(http://jsyeh.org/3dcg10)
然後下載3樣東西:source windows glut32.dll (可回顧week05)
今天要用的是texture.exe
簡單介紹如下圖
上圖中橘色部分是設定貼圖的點
上圖藍字中的另一種模式是這樣的,可以看出上面的程式長得不一樣,但是一般不會去調他
把
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
改成
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
可以看到他把圖片從重複變成延伸
安裝OPENCV 2.1
從google搜尋opencv 2.1,把前面看到的兩個下載,不會用的話可以去看第三個,是老師的影片
好像還有一個是檔名比較長的,但是我搜尋的時候沒有出來
(可以去moodle下載最快)
影片介紹部分有解釋為什麼要下載這個的原因
第二次搜尋 要下載的是打星星的那個
安裝過程中要注意部分
左邊紅圈表示要安裝的是這個,不要裝錯
右邊紅圈表示安裝中過程中這邊要注意(其他就按下一步就好)
現在要來開codeblocks的專案擋了
首先要不要選"OpencCV project",因為他已經不能用了
要選"console application"
經過取檔名之後~~~
噠噠噠
會出現這樣的東西,執行之後會出現Hello world!
把裡面東西砍光,開始生自己的
(可以從老師youtube中找到程式碼)
(https://www.youtube.com/watch?v=iu6RI4ns4n8)
首先先去找一張地球的圖片(不然沒有圖片的話程式會當機)
程式貼上之後,執行就會發現第一行就出問題了
補充程式:
#include "opencv/highgui.h"
int main()
{
IplImage * img=cvLoadImage("earth.jpg"); //圖檔要準備好,不然程式會死掉
cvNamedWindow("hello");
cvShowImage("hello", img);
cvWaitKey(0);
return 0;
}
這時候要去專案那裏按右鍵的Build Option
去Search directions
Compiler要加include Linker要加lib
去Linker Settings增加以下三個
cv210
cxcore210
highgui210
然後執行之後,自己的圖片就會出來了~
*如果執行過程中出現錯誤訊息(例如說少了xxx.dll)的話,就把codeblocks關掉重開就好了
不然的話就先去cmd的path找找看有沒有lib之類的,沒有的話要去重載opencv(注意提醒)再去重開codeblocks就可以了
程式介紹:
glTexCoord2f( tx, ty);
// glut texture貼圖 coordinate座標 2float tx貼圖x座標 ty貼圖y座標
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
//可以排列組合成4種
現在新增一個glut專案
然後依照剛剛去按專案右鍵的Build Option去設定
這樣這個新的程式就可以使用opencv的功能了
去玩一下~
把程式打成這樣,再去執行會看到灰色的框框,再按下空白鍵,可以發現他們是可以共存的
然後再改一些東西,就可以把原本的圖片也弄出來了
(要改目錄位置,這樣圖片才可以放在專案的資料夾讀的到,然後要把freeglut.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("earth.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();
}
執行之後就可以看到一顆會轉動的地球(然後好像破掉了XP)
換了一張圖之後,就沒有破掉了 應該是因為原本那張圖沒辦法接在一起,所以才會破掉
換了一張畫素低的地球,就會出現一顆畫素低的地球
用png檔也可以
但是用奇怪的圖也會變奇怪的地球






















沒有留言:
張貼留言