2024年6月6日 星期四

week16電腦圖學

  

 Week16

week16-0_sample

1. 先設定好環境

2. 安裝 freeglut 再把 lib\libfreeglut.a 複製成 libglut32.a

3. 安裝 opencv 2.1, 記得要 Add PATH, 不要設目錄

4. 關閉重開 CodeBlocks (才會把 PATH 設定設好 要記得存檔)

5. -Search directories 的 Compiler 對應 C:\OpenCV2.1\include

6. -Search directories 的 Linker 對應 C:\OpenCV2.1\lib

7. -Linker setting 要加 cv210 cxcore210 highgui210

8. File-New-Project, GLUT專案 week16-0_sample

9. 接下來要看課本的程式

10. 到 https://jsyeh.org/3dcg10/ 下載 data win32 兩個都解壓縮 把data 放進 win32 裡面

11. 點開 Projection.exe


week16-1_sample_gluLookAt


1. File-New-Project, GLUT專案 week16-1_sample_gluLookAt

2. 要改 resize() 函式在裡面, 加上 gluLookAt () 函式

3. 就可以看著左上角的圓球


4. 現在要做另一個修改, 想要在按按鍵時, 看不同地方


5. 要把剛剛加的第39行註解掉


6. 按鍵盤 1


7. 按鍵盤 2


8. 按鍵盤 3


week16-2_glutReshapeFunc_gluPerspective_gluLookAt

1. 請先看課本範例

2. gluPerspective 透視投影

3. gl0rtho 垂直投影

4. glFrustum 比較奇怪, 我們通常不用它的投影法

5. 左, 右,下,上,近,遠 共6組參數

6. 我們要寫11行 + 8行, 做出透視投影

7. File-New-Project, GLUT專案 week16-2_glutReshapeFunc_gluPerspective_gluLookAt

8. 貼上11行GLUT簡單程式碼

    #include <GL/glut.h>
    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("week09 Microsoft Visual Studio");
    glutDisplayFunc(display);
    glutMainLoop();
    }

9. 在int main() 裡 , 加入glutReshapeFunc();


10. 在24行加入一行程式碼, 可以固定視窗大小



week16-3_myTexture_id1_id2_glBindTexture

1. File-New-Project, GLUT專案 week16-3_myTexture_id1_id2_glBindTexture

2. 偷用week05_rotating_earth/main.cpp裡的程式碼

3. 但執行會出錯, 因為沒有圖檔

4. 把老師傳的 earth.jpg 放在 C:/ 裡面

5. 修改程式碼, 新增背景




#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric * quad = NULL; ///todo: 要有一顆指標
int id1, id2; ///要準備兩個整數, 用來存貼圖的代號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;
}
///再貼上10行GLUT程式 (不要貼剛剛的程式)
float angle = 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, id2); ///舞台背景
    glBegin(GL_POLYGON);
        glTexCoord2f(0, 0); glVertex2f(-1, +1);  ///y改
        glTexCoord2f(0, 1); glVertex2f(-1, -1);
        glTexCoord2f(1, 1); glVertex2f(+1, -1);
        glTexCoord2f(1, 0); glVertex2f(+1, +1);
    glEnd();
    glBindTexture(GL_TEXTURE_2D, id1); ///地球
    glPushMatrix();
        glRotatef(90, 1, 0, 0);
        glRotatef(angle++, 0, 0, 1);
        gluSphere(quad, 0.5, 30, 30); ///glutSolidTeapot( 0.3 ); ///把地球半徑改0.5
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char*argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutInitWindowSize(500,500); ///修改視窗大小
    glutCreateWindow("week16-3_myTexture_id1_id2_glBindTexture");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    id2 = myTexture("c:/background.jpg"); ///自找圖
    id1 = myTexture("c:/earth.jpg");
    quad = gluNewQuadric(); ///todo:把這顆指標,指好
    gluQuadricTexture(quad, 1);///todo: 做好地球的貼圖
    glutMainLoop();
}










沒有留言:

張貼留言