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. 就可以看著左上角的圓球
5. 要把剛剛加的第39行註解掉
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();
}
沒有留言:
張貼留言