2015年5月7日 星期四

02160792_蔡靖嵐 week11

week 11
1)Timer計時器
2)多個貼圖
3)作業:互動小遊戲
4)總結整體觀念

先下載freeglut解壓縮
New Projectm->GLUT專案


因為茶壺會因視窗大小而轉動快慢,所以我們要控制它甚麼大小轉動速度都一樣.
會先用簡單的方法.
使用freeglut
void timer(int t)
{
glutTimerFunc(10 timer,0);
angle++;
glutPostRedisplay();
}

然後開一個專案把freeglut跟opencv都設定好,再練習上一堂的進度,旋轉地球
我們回到今天的進度,多個貼圖.
把兩張地圖照片貼在地球上,再使用mouse的程式,就可以使用滑鼠按住就會換成另外一個照片.

剛剛用兩張圖片來做的地球,是把程式碼複制一次,再改圖片2的名字,但是做完之後,老師就說其實還有一個更簡略的方法,就是用函式把程式碼加進去.出來的結果就會跟之前的一樣.
#include <opencv/highgui.h> ///for cvLoadImage()
#include <opencv/cv.h> ///for cvCvtColor()
#include <GL/glut.h> ///3D glut
#include <stdio.h>
float angle=0; ///自動轉很帥
GLUquadric * quad;
void timer(int t)
{
    glutTimerFunc(20,timer,0);
    glutPostRedisplay();
}
void display()
{   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
    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();///自動轉很帥
    glFlush();
    angle+=1;///自動轉很帥
}
GLuint id;
GLuint id2;
void mouse(int button,int state,int x,int y)
{
    if(state==GLUT_UP)glBindTexture(GL_TEXTURE_2D,id2);
    else if(state==GLUT_DOWN)glBindTexture(GL_TEXTURE_2D,id);
}
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 myInit()
{
    quad=gluNewQuadric();
    id=myTexture("image.jpg");
    id2=myTexture("image2.jpg");
}
int main(int argc, char**argv)
{   glutInit(&argc, argv);
    glutCreateWindow("3D");
    glutDisplayFunc(display); ///顯示
    //glutIdleFunc(display);///自動轉很帥 (閒閒沒事幹, 就重畫)
    glutTimerFunc(0, timer, 0);
    glutMouseFunc(mouse);
    myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
    glutMainLoop();
}







沒有留言:

張貼留言