2021年4月7日 星期三

NEKO no Computer Graphics_week07

     

   


    早安

    今天要學貼圖

    首先要讀入圖片

    我們使用opencv的功能來做讀

    於是先下載opencv,載完之後設定codeblocks:

    1. Compiler>Search directories>compiler>add(:C/opencv2.1/include)

    2. Compiler>Search directories>linker>add(:C/opencv2.1/lib)

    3. Compiler>Linker setting>add(cv210,cxcore210,highgul210)

    

    設定完之後,就可以寫程式了,程式如下:

    

#include <opencv/highgui.h>//讀入opencv標頭檔
int main()
{
    IplImage * img = cvLoadImage("NEKO.jpg");//把圖放進(freeglut/bin),用IplImage設立變數並讀入
    cvShowImage("NEKO",img);//開視窗並顯示圖片
    cvWaitKey(0);//持續視窗
}

    寫完上面的碼

    接著去複製其他源碼(要貼圖的碼太複雜):

可以看到,圖貼在茶壺上很怪

    

    然後把茶壺刪掉,自己貼一個原圖:

    

一開始先熟悉貼圖,就不做花樣了

    glTexCoord2f(tx,ty)代表貼圖的座標

    用多邊形描點畫出來並貼圖


    貼圖座標(黃點對應程式):

    

    


    
補充:旋轉地球:
#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * quad;
void init()
{
    IplImage * img = cvLoadImage("圖檔名");
    cvCvtColor(img,img, CV_BGR2RGB); 
    glEnable(GL_TEXTURE_2D); 
    GLuint id;
    glGenTextures(1, &id); 
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    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);
    quad = gluNewQuadric();
}  
float angle=0;
void display()
{

    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, 0.5, 30, 30);///glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week07");

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glEnable(GL_DEPTH_TEST);
    init();

    glutMainLoop();
}



 886



沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...