2024年6月6日 星期四

電腦圖學week16

  ##week16-0_sample

1.安裝freeglut

準備上課環境

0.freeglut

1.OpenCV

2.設定CodeBlocks

    (1)C:\OpenCV2.1\include


    (2)C:\OpenCV2.1\lib


    (3)cv210 cxcore210 highgui210


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


課本程式:

jsyeh.org/3dcg10下載data、win32,並解壓縮全部



將data拉進win32並開啟Projection

 gluLookAt 可以轉換鏡頭




  ##week16-1_sample_gluLookAt

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

2.要改resize()函式在裡面,加上gluLookAt(0,0,0,-2.4,1.2,-6,0,1,0);

就可以看著左上角那個圓球




現在要做另一個修改,先把剛剛加的第39行註解

再加 if 條件式和鍵盤控制的條件

if(key=='1'){ ///看左上角

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity() ;

    gluLookAt(0,0,0, -2.4,1.2,-6 , 0,1,0);

}

else if(key=='2'){ ///看正上方

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity() ;

    gluLookAt(0,0,0, 0,1.2,-6 , 0,1,0);

}

else if(key=='3'){ ///看右上角

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity() ;

    gluLookAt(0,0,0, +2.4,1.2,-6 , 0,1,0);

}







  


##week16-2_glutReshapeFunc_gluPerspective_gluLookAt

先看課本範例


gluPerspect透視投影

glOrtho垂直投影

glFrustum比較奇怪,我們通常不用他ㄉ呃投影法

左、右、上、下、近、遠 共6組參數


glUPerspective(視角、長寬比、z近、z遠)

fovy field view in y視角

aspect ratio長寬比


我們要寫個程式11行+8行,做出透視投影

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

2.貼上11行簡單程式碼:

    #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_RGB | GLUT_DOUBLE | GLUT_DEPTH);

        glutCreateWindow("week08 gundam");

        glutDisplayFunc(display);


        glutMainLoop();

    }

3.在 int main()裡,加入glutReshapeFunc(reshape)

4.加入程式:

void reshape(int w,int h){

    glViewport(0,0,w,h);///設定視窗會看到的區域

    float ar=w/(float)h;///長寬比、寬長比

    glMatrixMode(GL_PROJECTION);///切換投影矩陣

    glLoadIdentity();

    gluPerspective(60,ar,0.01,100);///透視投影


    glMatrixMode(GL_MODELVIEW);///切換model view矩陣

    glLoadIdentity();

    gluLookAt(0,0,-2,0,0,0,0,1,0);

}




##week16-3_mtTexture_id1_id2_glBindTexture

若想要有"兩張貼圖"(一張背景、一張給模型)

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

2.偷week05_reotating_earth的程式碼

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

4.圖檔存下來後放在C槽




5.修改程式:

```cpp

int id1, id2;///要準備兩個整數用來存貼圖的代號

```

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);

        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 );

    glPopMatrix();

    glutSwapBuffers();

}

```

int main(int argc, char*argv[])

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);

    glutCreateWindow("week05");

    glutIdleFunc(display);

    glutDisplayFunc(display);

    id1=myTexture("c:/earth.jpg");

    id2=myTexture("c:/background.jpg");///自己找圖

    quad = gluNewQuadric(); ///todo:把這顆指標,指好

    gluQuadricTexture(quad, 1);///todo: 做好地球的貼圖

    glutMainLoop();

}


沒有留言:

張貼留言