Week16 camera 攝影機
week16-0_sample
1. 安裝freeglut,複製libfreeglut.a改成libglut32.a
2. 下載OpenCV選第2或3選項別選第1個
3. 安裝在預設的目錄,重開CodeBlocks(讓編譯器讀到檔案)
3.0 去設定 Settings->Compiler 要加3個設定
3.1 search目錄 Compiler的 include目錄 加C:\OpenCV2.1\include
3.2 search目錄 Linker 的 lib目錄 加C:\OpenCV2.1\lib
3.3 加入Linker設定的 3個檔名 cv210 cxcore210 highgui210
4. 開GLUT專案取成week16-0_sample
下載老師範例檔
1. 下載win32跟data
2. gluLookAt有3個座標參數
eye 鏡頭的起始位置
center 鏡頭看向的終點
up 哪裡是上
3.
透視投影gluPerspective(以Y軸呈現能看到的視角角度, 影響物件的長寬比,
Z近, Z遠)
fovy field of view in y視角
aspect ratio長寬比
垂直投影glOrtho
不常用glFrutum
week16-1_sample_gluLookAt
1. 開GLUT專案取成week16-1_sample_gluLookAt
2. 讓畫面注視左上的圓
gluLookAt(0, 0, 0, ///鏡頭起始位置
-2.4, 1.2, -6 ///想看的位置成為中心
, 0, 1, 0);
3. 用案鍵來控制看哪裡
並把剛剛的程式碼註解///gluLookAt(0, 0, 0, -2.4, 1.2, -6, 0, 1, 0);
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);
}
1.視窗每次更改會自動調整大小
#include <GL/glut.h>
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
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);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week16-2");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
}
week16-3_myTexture_id1_id2_glBindTexture
1. 新增GLUT專案week16-3_myTexture_id1_id2_glBindTexture
2. 複製week05_rotating_earth程式,並在C槽放入圖片
3. 多2個變數存放模型,並分別貼上各自的貼圖
int id1,id2;///存2個貼圖代號
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 );
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char*argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowPosition(500, 500);
glutCreateWindow("week05");
glutIdleFunc(display);
glutDisplayFunc(display);
id2 = myTexture("c:/back.jpg");///背景
id1 = myTexture("c:/earth.jpg");
quad = gluNewQuadric(); ///todo:把這顆指標,指好
gluQuadricTexture(quad, 1);///todo: 做好地球的貼圖
glutMainLoop();
}
補充
解決模型自動縮放
glmScale(pmodel, 1.0/24);先觀察OBJ檔的XYZ哪個值最大
就除他的整數項
就除他的整數項
沒有留言:
張貼留言