2022年4月26日 星期二

新手上碌_week10

 1.開啟上周的程式碼

#include <GL/glut.h>///使用GLUT的外掛
#include <opencv/highgui.h>
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
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 display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///畫之前先清除畫面
        glutSolidTeapot(0.3);///畫茶壺
    glutSwapBuffers();///畫好後呈現出來
}
int main(int argc,char** argv){
    glutInit(&argc,argv);///把參數送給glutInit初始化
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///雙緩衝區+3D深度功能
    glutCreateWindow("第09周的程式喔!");///開啟GLUT視窗
    glutDisplayFunc(display);///用來顯示的程式
    myTexture("grapth1.png");
    glutMainLoop();///主要的程式迴圈
}

2.利用期中考的程式碼貼圖/座標

glBegin(GL_POLYGON);

    glTexCoord2f(x,y);

    glVertex2f(x,y);

glEnd();

修改的片段:

3.貼圖+貼到圓球>>>>>會動的地球
畫圓球:圓球的3D座標+2D貼圖座標
>>使用sin(),cos()
利用:
OpenGl(GL)                                glvertex2f(x,y);        頂點

Opengl Utilities(GLU)                gluSphere();             圓球

Opengl User Toolkit(GLUT)      glutSolidTeapot();   茶壺 

的函式



讓它轉動:
把它轉正:


glEnable(GL_DEPTH_TEST);///開啟3D深度測試 才有3D效果
#include <GL/glut.h>///使用GLUT的外掛
#include <opencv/highgui.h>
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#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轉色彩 (需要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;
}
float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///畫之前先清除畫面

    glPushMatrix();
        glRotatef(90,1,0,0);///把他轉正
        gluQuadricTexture(sphere,1);///設定好貼圖
        gluQuadricTexture(sphere,1);///設定好貼圖
        gluSphere(sphere,1,30,30);///畫圓球
    glPopMatrix();

    glutSwapBuffers();///畫好後呈現出來
    angle+=1;
}
int main(int argc,char** argv){
    glutInit(&argc,argv);///把參數送給glutInit初始化
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);///雙緩衝區+3D深度功能
    glutCreateWindow("第10周的程式喔!");///開啟GLUT視窗

    glEnable(GL_DEPTH_TEST);///開啟3D深度測試 才有3D效果
    glutIdleFunc(display);///有空idle呼叫display()
    glutDisplayFunc(display);///用來顯示的程式
    myTexture("grapth1.png");
    sphere=gluNewQuadric();///準備二次曲線
    glutMainLoop();///主要的程式迴圈
}






尖🦉-圖學筆記 Week10

◇實作背景貼圖:

    1.將freeglut資料夾、OpenCV-2.1.0裝好 (需重開codeblocek)。並開一個新的Glut專案。

    2.將OpenCV三個(目錄 / Lib 目錄 方法)設定完成。

    3.複製上周最後的程式碼 (texture)、下載一張earth.jpg放到freeglut\bin資料夾。

    4.利用

            glBegin(GL_POLYGON);

                glTexCoord2f( 0 , 1); glVertex2f( -1, -1);  左下,記得貼圖是逆時針座標和頂點不一樣

            glEnd();

       將圖片定位。


◇ 將貼圖貼到圓球:

    1.建立一個新專案。

    2.新增程式碼:

        先設好空指標: GLUquadric * sphere = NULL; ///指標,指到二次曲面

        在display()函式:

        設貼圖: gluQuadricTexture(sphere,1);///指標,是否開啟

        畫圓: gluSphere(sphere1   ,30    ,30);

               分別為指標, 半徑, 直切(似經度),堆疊(似緯度)

        在main()裡:

          準備好2次曲面: sphere = gluNewQuadric();

    3.使地球可以旋轉:

        在display()裡 : glPushMartrix();glPopMartrix(); 之間加入glRotatef(angle, 0 , 0 , 1);

        並設好angle

        在main函式裡放好:

            glutIdleFunc(display);///有空idle呼叫display

    4.新增: glRotatef(90, 1 , 0 , 0);///把地球轉正,使他能按照赤道旋轉。

       在main裡:glEnable(GL_DEPTH_TEST);///開啟深度功能


筆記~圖學 Week10

程式texture

0.(沿用week09的貼圖),圖片左上角是(0,0),視窗左下角是(-1,-1)

1.背景貼圖

2.圓球貼圖(不會轉)

3.圓球貼圖(會轉)

´◔౪◔)Morning Star

 Week 10圖學筆記

今日主題:貼圖

#先將上周的project 的cv 10行程式碼複製到新project

#重新做OpenCV設定

    0-1. seting-compiler-serch directories-compiler-add inclode



    0-2. seting-compiler-serch directories-linker-add lib


    0-3. seting-compiler-linker setttings-add咒語 (cv210/cxcore210/highgui210)

    0-4. 再把圖檔放進工作目錄中 (in c:\Users...\freeglut\bin)

#做成背景貼圖,黏在四個點上 (從左下,逆時針繞圈圈)

    完成了

#把上週貼圖貼到圓球上

    1. 開新GLUT專案 (week10_texture_earth)

    2. 貼上前面的程式並加上以下程式碼

        main() : sphere=gluNewQuadric();///準備好二次曲面

        GLUquadric *sphere =  NULL;

        display() : gluQuadricTexture(sphere,1);///設好貼圖、 gluSphere(sphere,1,30,30);///畫圓球

    3. 畫圓球

        3-0. 圓球的座標要用 cos()、sin() 算出來

        3-1. 會用到以下函式

                a. OpenGL (GL) 的函式

                b. OpenGL Utilities (GLU) 的函式 ex: gluSphere(一個指標, r指標, slices經線(直), stacks緯

                    線)

                c. OpenGL User Toolkit (GLUT) 的函式 ex: gluSolidTeapot()

#把地球旋轉

    1. 新增旋轉程式碼在 dispaly() 裡

    2. 在 main() 新增 glutIdleFunc(display); 才能動喔

    3. 再新增一次rotatef在display()裡,把他轉正

    4. 一定要在main()裡,新增glEnable(GL_DEPTH_TEST);///開3D深度測試,才會有3D的效果


#主題三 貼3D模型

    1. 下載 jsyeh.org/3dcg10 的 window、data、source(glm.h、glm.cpp) 放在專案目錄
    2. 開新專案 (week10_texture_model)
    3. 工作目錄裡要放 Gundam 模型

~~~下課了~~~

圖學筆記Week10

 本週課程內容:背景貼圖、地球貼圖

背景貼圖

步驟:進到Moodle下載opencv2.1.0(path:環境目錄的路徑)-->開啟codeblocks新增專案-->做出上週texture的專案圖片放入freeglut\bin

(如下圖)-->把茶壺改掉-->定四個角座標(逆時針)作背景貼圖(如下圖)



成果圖


地球貼圖
步驟:開啟codeblocks新增專案-->使用上方專案為基底-->設定球體和二次曲線(如下圖)-->產生貼圖於球體上(如下圖)-->改變視角(如下圖)



成果圖






古利夏醫生的艾爾迪亞日記week10

早上肚子很餓

把上週程式拿出來
#include <GL/glut.h>
#include <opencv/highgui.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); 
    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);
    return id;
}
void display(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc,char** argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("第09周的程式喔!");
    glutDisplayFunc(display);
    myTexture("grapth1.png");
    glutMainLoop();
}
可以轉的地球

程式碼

#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * sphere=NULL;///指到二次曲面的指標
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename);
    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);
    return id;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    gluQuadricTexture(sphere,1);///二次曲面貼圖(指標,是否貼圖)
    gluSphere(sphere,1,30,30);///圓球(指標,半徑,直切數,橫切數)
    glutSwapBuffers();
}
int main(int argc,char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week10 texture earth");
    glutDisplayFunc(display);
    myTexture("earth.jpg");
    sphere=gluNewQuadric();///準備二次曲面
    glutMainLoop();


WEEK 10 天氣晴

VERY BEAUTIFUL, VERY POWERFUL

一.     一樣先安裝且設定好freeglut,OpecCV, 開啟CodeBlocks建立新專案 week11_gundam,                 把 MyGundam.zip下載解壓縮後的data資料夾放到freeglut/bin裡面 把week09_openc...