2024年6月6日 星期四

C~電腦圖學日誌 Week16

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

week16-2_glutReshapeFunc_gluPerspective_gluLookAt

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




2. glutInitWindowSize(300, 600);///可改視窗大小

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哪個值最大
就除他的整數項

Github



沒有留言:

張貼留言