前置作業
下載上課用檔案
下載位置:https://jsyeh.org/3dcg10/
下載檔案及名稱:1. data.zip、2. win32.zip、3. glut32.dll
解壓縮
windows.zip => 獨立解出一個資料夾
data.zip => 將data解壓縮到window資料夾內
--------> 開啟Texture.exe檔案,展示如下
在此範例程式,分別操控的頂點如下圖所示
在3D的世界裡,圖學多使用三角形,ex:Unity, 3dxMax, OpenGL...
在人類理解的世界哩,四邊形較好用,ex:Maya
tx,ty改變,會改變整張貼圖的展示
如下圖2顯示,增加第2、3號頂點的座標
整張貼圖會如同優者相同圖案,且是連續接在一起的壁紙一樣
持續往下將後面的圖案露出來
並壓縮前方貼圖的內容((只為了能展示在一個畫面中
------------------------------------------------------------------------------------------------------------------------
如果成功讀出來,表示設定成功
----------------------------------------------------------------------------------------------------------------
week07-2_MyTexture
進入老師的github提取範例程式
https://gist.github.com/jsyeh/5ed01210559721ec71b659b3ffed2dd7
逐字檢查程式碼,並且留意圖片檔案的位置
下載缺少的圖(earth.jpg // 我的範例圖片下載位置:https://www.google.com/search?q=earth+map&tbm=isch&ved=2ahUKEwjAxPHkl4D-AhXQCt4KHc4rDJwQ2-cCegQIABAA&oq=earth+map&gs_lcp=CgNpbWcQAzIFCAAQgAQyBQgAEIAEMgUIABCABDIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjoECCMQJ1DWBli2C2D1DGgAcAB4AIABI4gBnwGSAQE1mAEAoAEBqgELZ3dzLXdpei1pbWfAAQE&sclient=img&ei=-K4jZMDoMtCV-AbO17DgCQ&bih=913&biw=1920#imgrc=9WRzYweNFKCUKM )
放置在正確的目錄下==>freeglut/bin
修改範例程式,將茶壺形狀改變為矩形
利用
glTexCoord2f(x,y); glVertex2f(vx,vy);
設定圖片的座標與頂點
week07-3_Myearth
https://gist.github.com/jsyeh/5ed01210559721ec71b659b3ffed2dd7
再次進入老師的github提取範例程式,這次利用myEarth.cpp的程式碼
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * sphere = NULL;///一個指到二次曲面的指標
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;
}
float angle=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0,-1,0);
glRotatef(90, 1,0,0);
gluQuadricTexture(sphere, 1);
gluSphere(sphere, 1, 30, 30);///glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
angle++;
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week10 texture background");
glutIdleFunc(display);
glutDisplayFunc(display);
///myTexture("myEarth.jpg"); /// 注意讀檔的檔名
myTexture("earth.jpg");
sphere = gluNewQuadric();
glEnable(GL_DEPTH_TEST);
glutMainLoop();
}
沒有留言:
張貼留言