2022年4月25日 星期一

Fei的筆記

 Week 10

1.Texture_background

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

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

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

}



3.旋轉地球

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


}

3.旋轉鋼彈

Step 1.開新的Project GLUT 

Step 2.下載老師的myGundam.zip

Step 3.把myGundam裡的data放進freeglut\bin

Step 4.去下載source(https://jsyeh.org/3dcg10/)

Step 5.把source裡的 glm.h  glm.c(檔案總管要勾選附檔名/改成glm.cpp) 然後丟到桌面儲存好的專案裡


Step 6.把旋轉地球的程式貼到新建立的Project裡,然後把glm.cpp Add File


Step 7.完成程式碼,你就有會轉的鋼彈了喔




沒有留言:

張貼留言