2023年3月29日 星期三

Deverra//week07 貼圖

 

WEEK07
------------------------------------------------------------------------------------------------------------------------------利用老師的範例下載---->  https://jsyeh.org/3dcg10/

打開Texture.exe的範例檔
四個頂點分別對應四個角(逆時針方式標點)

把模型轉成棋盤格來觀察,會發現座標超過1.0時
會拆分成2個三角形

-----------------------------------------------------------------------------------------------------------------------------
期中考練習網站
jsyeh.org/gl

glPushMatrix(); //備份矩陣
    glTranslatef(x,y,z);  //移動
    glRotatef(角度,x,y,z);  //旋轉
    glScalef(x,y,z);  //縮放
    glBegin(GL_POLYGON);  //開始畫
        glColor3f(r,g,b);  //色彩
        glNormal3f(x,y,z);  //打光的法向量
        glTexCoord2f(tx,ty);  //貼圖座標
        glVertex3f(x,y,z); //頂點
    glEnd();  //結束畫
glPopMatrix();  //還原矩陣
-----------------------------------------------------------------------------------------------------------------------------

▦OpenCV的設定
CodeBlocks中>>setting >> Complier
在search directories中
Complier中加入>>>  C:\OpenCV2.1\include
Linker中加入>>>>  C:\OpenCV2.1\lib
在Linker setting中加入 cv210  cxcore210  highgui210




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

▦第一個程式

#include<opencv/highgui.h>
int main()
{
    IplImage * img = cvLoadImage("image.jpg"); //注意副檔名要是jpg
    cvShowImage("week07",img);
    cvWaitKey(0);
}





-----------------------------------------------------------------------------------------------------------------------------
▦第二個程式
https://gist.github.com/jsyeh/5ed01210559721ec71b659b3ffed2dd7

找到老師的程式碼

#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("week09 texture");
    glutDisplayFunc(display);
    myTexture("earth.jpg");
    glutMainLoop();
}

用下載的圖片放到茶壺上面



-----------------------------------------------------------------------------------------------------------------------------
▦第三個程式
修改上面的程式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();
    glutSwapBuffers();
}


覺得世界地圖貼在茶壺上看不清楚不好看
另建四個貼圖座標出來



///全刪,拿剛剛的程式來用!!!
#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("earth.jpg");
    sphere = gluNewQuadric();
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
}




---------------------------------------------------------------------------------------------------------------------------
世界地圖的圖檔




沒有留言:

張貼留言