2022年4月25日 星期一

week10👻


Texture_backgroun

1. freeglut 安裝好完成前置作業

2. 先去找圖把圖片存在freeglut(老師上課用軟體裡下載)-bin 裡面

3. 完成程式 即會出現地球

#include <opencv/highgui.h>

#include <opencv/cv.h>

#include <GL/glut.h>

int myTexture(char * filename)

{

    IplImage * img = cvLoadImage(filename); ///OpenCV讀圖

    cvCvtColor(img,img,CV_BGR2RGB);///OpenCV轉色彩

    glEnable(GL_TEXTURE_2D);///開啟貼圖功能

    GLuint id;///產生Generate貼圖ID

    glGenTextures(1,&id);///綁定bin 貼圖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 myTexture()

{

    IplImage * img = cvLoadImage("earthmap.jpg");

    cvShowImage("img",img);

    cvWaitKey(0);

}

void display()

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    //glutSolidTeapot( 0.3 );

    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();


    glutSwapBuffers();

}

int main(int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("week10 texture background");

    glutDisplayFunc( display );

    myTexture("earthmap.jpg");

    glutMainLoop();

}

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

地球旋轉

#include <opencv/highgui.h>///使用OpenCV 2.1

#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轉色彩

    glEnable(GL_TEXTURE_2D);///開啟貼圖功能

    GLuint id;///產生Generate貼圖ID

    glGenTextures(1,&id);///綁定bin 貼圖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+=0.1;///angle++ 會轉太快 跟電腦效能有關

}


int main(int argc, char**argv)

{

    glutInit( &argc, argv );

    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );

    glutCreateWindow("week10 texture background");


    glutIdleFunc(display);

    glutDisplayFunc( display );

    myTexture("earthmap.jpg");

    sphere = gluNewQuadric();

    glEnable(GL_DEPTH_TEST);

    glutMainLoop();


}



沒有留言:

張貼留言