2018年6月13日 星期三

Week14 游伃瑄

(1) 到 http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 

下載 [data] [win32] [glut32.dll] 三個檔案


(2) 將下載好的壓縮檔 [windows] 和 [data] 解壓縮,

並將 [glut32.dll] 和 [data] 複製到window資料夾裡


(3) 開啟 Projection.exe 並試著操作看看


gluperspective(48.0, 1.12, 1.0, 1.9) 

fovy 代表 拍攝的角度視野大小
aspect 代表 人物的大小比例
zNear 代表 前方視野的距離範圍
zFar 代表 後方視野的距離範圍



--------------------------------------------------------------------------

(1) 在 Codeblocks 開啟 GLUT 程式


到moodle下載freeglut-MinGW-3.0.0-1.mp.zip > 解壓縮 > freeglut > lib > 
複製libfreeglut.a > 貼上並重新命名為libglut32.a > 開啟Codeblocks > File > 
New > Project > GLUT


(2) 程式碼的介紹

glEnable(GL_DEPTH_TEST); //3D深度測試
glDepthFunc(GL_LESS);

glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL); //打開 Material
glEnable(GL_LIGHTING); //打開lighting

glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient); //打光的設定
glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient); //設定Material
glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glutMainLoop(); //主要迴圈


█ 若關閉lighting ( 移除 glEnable(GL_LIGHTING); 程式碼 )


█ 若關閉Material ( 移除 glEnable(GL_COLOR_MATERIAL); 程式碼 )


█ 鏡頭拍攝方向的改變

glCullFace(GL_BACK); 


glCullFace(GL_FRONT);


█ 攝影機和投影矩陣的設定

glutReshapeFunc(resize);


static void resize(int width, int height)
{
    const float ar = (float) width / (float) height; 
    // ar = aspect ratio 長寬比

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}


(3) 加入程式碼,可以以自訂的角度看模型

gluLookAt (0.3,10,0.3 ,0,0,-6 ,0,1,0);


(4) 加入程式碼,可以利用滑鼠自由調整看模型的角度

#include <math.h> //為了執行cos()和sin()

void motion(int x,int y)
{
    float angle =x*3.1415926/180.0;
    float cameraY=(y-300)/100.0;
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(5*cos(angle), cameraY, 5*sin(angle)-6, 0, 0, -6, 0, 1, 0);
    glutPostRedisplay(); 
//每次設定好就display一次
}

glutMotionFunc(motion);





沒有留言:

張貼留言