2015年5月6日 星期三

2015/5/6 week11 課堂作業 黃志楷

目標:球體等速度旋轉


    #include <opencv/highgui.h> ///for cvLoadImage()
    #include <opencv/cv.h> ///for cvCvtColor()
    #include <GL/glut.h> ///3D glut
    float angle=0; ///自動轉很帥
    GLUquadric * quad;
    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;///自動轉很帥
    }
    void myInit()
    {
        quad = gluNewQuadric();
        IplImage * img = cvLoadImage("1.jpg"); ///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);
    }   ///最後一行最難/最重要, 所有貼圖影像的資料都設定好
    void timer(int t)
    {
    glutTimerFunc(20,timer,0);///重複呼叫時間
    glutPostRedisplay();
    }
    int main(int argc, char**argv)
    {   glutInit(&argc, argv);
        glutCreateWindow("3D");
        glutDisplayFunc(display); ///顯示
        glutTimerFunc(0,timer,0);///呼叫時間
        myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
        glutMainLoop();
    }


目標:位置會規律移動


#include <opencv/highgui.h> ///for cvLoadImage()
    #include <opencv/cv.h> ///for cvCvtColor()
    #include <GL/glut.h> ///3D glut
    #include<math.h>
    float angle=0,potx=0,poty=0; ///自動轉很帥
    GLUquadric * quad;
    void display()
    {   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();///自動轉很帥
           glTranslatef(potx,poty,0);           
           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;///自動轉很帥
    }
    void myInit()
    {
        quad = gluNewQuadric();
        IplImage * img = cvLoadImage("1.jpg"); ///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);
    }   ///最後一行最難/最重要, 所有貼圖影像的資料都設定好
    void timer(int t)
    {
    glutTimerFunc(10,timer,0);///重複呼叫時間
    potx=cos(angle/180.0*3.14);
    poty=0.5*sin(angle/180.0*3.14);
    glutPostRedisplay();
    }
    int main(int argc, char**argv)
    {   glutInit(&argc, argv);
        glutCreateWindow("3D");
        glutDisplayFunc(display); ///顯示
        glutTimerFunc(0,timer,0);///呼叫時間
        myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
        glutMainLoop();
    }


目標:位置會上下移動



    #include <opencv/highgui.h> ///for cvLoadImage()
    #include <opencv/cv.h> ///for cvCvtColor()
    #include <GL/glut.h> ///3D glut
    #include<math.h>
    float angle=0,potx=0,poty=0; ///自動轉很帥
    GLUquadric * quad;
    void display()
    {   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();///自動轉很帥
            glTranslatef(potx,poty,0);
            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;///自動轉很帥
    }
    void myInit()
    {
        quad = gluNewQuadric();
        IplImage * img = cvLoadImage("1.jpg"); ///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);
    }   ///最後一行最難/最重要, 所有貼圖影像的資料都設定好
    void timer(int t)
    {
    glutTimerFunc(10,timer,0);///重複呼叫時間
    //potx=cos(angle/180.0*3.14);
    poty=0.5*sin(angle/180.0*3.14);
    glutPostRedisplay();
    }
    int main(int argc, char**argv)
    {   glutInit(&argc, argv);
        glutCreateWindow("3D");
        glutDisplayFunc(display); ///顯示
        glutTimerFunc(10,timer,0);///呼叫時間
        myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
        glutMainLoop();
    }



目標:拉動目標並射出


#include <opencv/highgui.h> ///for cvLoadImage()
    #include <opencv/cv.h> ///for cvCvtColor()
    #include <GL/glut.h> ///3D glut
    #include<math.h>
    int potq=0;
    float angle=0,potx=0,poty=0,potvx=0,potvy=0; ///自動轉很帥
    GLUquadric * quad;
    void display()
    {   glEnable(GL_DEPTH_TEST); ///要啟動 Detph Test 深度值的測試,3D顯示才正確
        glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();///自動轉很帥
            glTranslatef(potx,poty,0);
            glRotatef(90, 1,0,0);
            glRotatef(angle, 0,0,1);///自動轉很帥
            gluQuadricTexture(quad, 1);
            gluSphere(quad, 0.5, 30, 30); ///glutSolidTeapot(0.3);
        glPopMatrix();///自動轉很帥
        glFlush();

    }
    void myInit()
    {
        quad = gluNewQuadric();
        IplImage * img = cvLoadImage("1.jpg"); ///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);
    }   ///最後一行最難/最重要, 所有貼圖影像的資料都設定好
    void timer(int t)
    {
    glutTimerFunc(10,timer,t+1);///重複呼叫時間
    angle+=1;
    if(potq==0){poty=0.5*sin(angle/180.0*3.14);}
    if(potq==2){potx+=potvx; poty+=potvy;}
    glutPostRedisplay();
    }
    void mouse(int bu,int st,int x,int y)
    {
        if(st==GLUT_DOWN){potq=1;}
        else if(st==GLUT_UP){potq=2;potvx=-(x-350)/3500.0;potvy=-(y-350)/3500.0;}
    }
    void motion(int x,int y)
    {
        if(potq==1){potx=-(x-350)/350.0;poty=-(y-350)/350.0;}
    }
    int main(int argc, char**argv)
    {   glutInit(&argc, argv);
        glutCreateWindow("3D");
        glutMouseFunc(mouse);
        glutMotionFunc(motion);
        glutDisplayFunc(display); ///顯示
        glutTimerFunc(10,timer,0);///呼叫時間
        myInit(); ///我的 init 初始化 把貼圖準備好 前面OpenCV 2行, 後面 OpenGL 9行
        glutMainLoop();
    }










沒有留言:

張貼留言