# week16
## week16-0_sample
0. 下載 freeglut 至桌面, 並解壓縮, 更改 lib 中的檔名
1. 安裝 OpenCV
2. 設定 CodeBlocks, 改Setting - Compiler
a. compiler 的 include 要加入 C:\OpenCV2.1\include
b. linker 的 lib 要加入 C:\OpenCV2.1\lib
c. linker 設定, 要加入 cv210 cxcore210 highgui210
3. File-New-project, GLUT專案, week16-0_sample
接下來看一下課本範例
1. https://jsyeh.org/3dcg10/ -下載 data win32
2. 解壓縮 window.zip data.zip
3. 把 data 資料夾整個丟到 window 資料夾
## week16-1_sample_Lookat
1. File-New-project, GLUT專案, week16-1_sample_Lookat
2. 要改 resize{} 函式, 在裡面加上 Lookat{} 函式, 如下列橘色部分所示
```cpp
static void resize(int width, int height)
{
.,....
glLoadIdentity() ;
gluLookAt(0, 0, 0, -2.4, 1.2, -6, 0, 1, 0);
}
```
```cpp
static void key(unsigned char key, int x, int y)
{
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);
}
.....
}
```
6. 最後可以看到三個不同角度的視角
## week16-2_glutReshapeFunc_gluPerspective_gluLookat
先看課本 Projection.exe 的範例
gluPerapective 透視投影
glOrtho 垂直投影
glFrustum 比較奇怪, 通常不使用這個投影法
左、又、下、上、進、遠 共6組參數
gluPerspective( 視角, 長寬比, z近, z遠 )
fovy filed of view in y視角
aspect ratio 長寬比
我們將要寫個程式, 11行 + 8行, 做出透視投影
1. File-New-project, GLUT專案, week16-2_glutReshapeFunc_gluPerspective_gluLookat
2. 貼上 11 行 GLUT 程式碼
3. 在 int main() 裡 加入 glutReshapeFunc(reshape);
4. 寫自己的 void reshape()
5. 加上下方橘色部分程式碼
```cpp
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, 2, -2, 0, 0, 0, 0, 1, 0);
}
int main(int argc, char*argv[])
{
glutInitWindowSize(300, 600); ///這行可改視窗長寬
glutReshapeFunc(reshape);
}
```
6. 這個程式可以讓改變視窗大小的時候, 裡面的 圖的比例不變
## week16-3_myTexture_id1_id2_glBindTexture
若想要有「兩張貼圖」(一張背景、一張給模型)
1. File-New-project, GLUT專案, week16-3_myTexture_id1_id2_glBindTexture
2. 偷用 week05_rotating_earth 裡的程式碼
3. 但執行會出錯:OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376, 因為沒有圖檔!!
4. 所以要把圖檔放到 C槽 就會看到一顆轉動的地球
5. 接著加上下面橘色部分的程式碼
```cpp
int id1, id2;
int myTexture(char * filename)
{
......
}
void display()
{
glEnable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, id1); ///太空
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, id2); ///地球
}
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(500,500); ///視窗大小
glutCreateWindow("week016-3");
glutIdleFunc(display);
glutDisplayFunc(display);
id1 = myTexture("C:/space.jpg");
id2 = myTexture("c:/earth.jpg");
}
```
6. 會得到一顆地球在轉, 背景是太空的圖片



沒有留言:
張貼留言