##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();
}
沒有留言:
張貼留言