標籤(空格分隔): gamepython
本文主要介紹座標系的觀念, 以及在openGL中的視圖及其相關的變換。api
在一個三維座標系中, 一個模型的展現並不僅有一個視圖就能夠了。而是存在視圖變換,投影變換,模型變換的過程。函數
頂點座標---》(模型視圖矩陣)----》視覺座標---》(投影矩陣)----》裁剪座標----》(透視座標)----》規範化設備座標----》視口變換----》窗口座標
在opengl中主要經過如下三種變換達到最終控制屏幕輸出:oop
爲了進行視圖,模型,投影變換, 能夠建立一個4*4的矩陣M而後讓他與頂點對應的座標v相乘,以實現變換:
$$v' = Mv$$code
gl庫只是一個圖形庫, 在咱們寫的窗口程序的過程當中,我必須寫窗口程序已經消息處理,咱們能夠本身寫 ,固然也能夠用gult庫。glut庫中的api都已glut開頭,最典型的現實一個窗口以下:orm
glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop();
代碼很簡單,而咱們要關注的是三個函數:ip
咱們能夠用以下代碼建立一個球體it
void PlanteDisplay::excute() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); drawSun(); } void PlanteDisplay::drawSun() { glutWireSphere(1.0, 20, 16); /* draw sun */ glutSwapBuffers(); }
咱們能夠加上一些初始化的動做io
void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); }
咱們會發現有以下所示的球體:class
咱們創見好了物體, 可是尚未設置好攝像機,opengl默認狀況下回把攝像機正對着屏幕,而攝像機的鏡頭設置就在reshage中實現,在該函數中, 咱們主要控制視圖變換和投影變換。
視口變換決定了場景所映射的有效屏幕區域的形狀。利用函數glViewport來實現。
最簡單的變換以下:
void cubeReshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); }
咱們改變屏幕的裁剪區域(投影變換):
glViewport(50, 0, (GLsizei)w/2, (GLsizei)h/2)
會發現以下圖顯示:
調用變換函數以前,須要肯定本身想修改的模型視圖矩陣仍是投影視圖矩陣,能夠用glMatrixMode() 選擇矩陣,並用glLoadIdentity() 把當前可修改矩陣清除爲單位矩陣。
glMatrixMode(GL_PROJECTION); glLoadIdentity();
在OpenGl中,有三個函數用於執行模型變換:
如:
glTranslatef(0.2, .2, 0); glScalef(1.5, 2.0, 1); glutWireSphere(0.4, 50, 8);
視圖 變換擁有膝蓋觀察點的位置和方向。能夠由兩種方法來實現:
正常如圖所示:
gluLookAt(0.0, 0.0, 0.0 , 0.0, 0.0, -1.0 , -1.0, -1.0, 0.0);
gluLookAt(0.0, 0.0, 0.0 , 0.0, 0.0, -1.0 , 0.0, -1.0, 0.0);
投影變換最終控制線上屏幕的裁剪區域, opengl中能夠用:
來進行投影變換。
glFrustum(GLdouble left , GLdouble right , GLdouble bottom , GLdouble top , GLdouble near , GLdouble far)
其中: (left, botton, -near)表示近側裁剪平面左上角的座標,(right, top, -near)表示右下角座標,near和far分別表示觀察點到近側和遠側的距離。