LearnOpenGL學習筆記(七):一個FPS攝像機系統
阿新 • • 發佈:2018-12-13
LearnOpenGL學習筆記(七)
1.攝像機概述
1.1LookAt矩陣
要想在OpenGL中順利的使用攝像機,我們需要藉助GLM來構建一個LookAt矩陣,形式如下:
glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f));
lookAt 函式需要接受三個vec3引數,分別是攝像機的位置向量、目標以及上向量。這裡的位置向量是從原點指向攝像頭位置的向量,目標是攝像頭鏡頭所對著的地方,而上向量是表示世界空間中的上向量。
一個合格的攝像機系統應當能做到視角的自由切換,那我們就需要將lookAt的三個引數用變數來代替,這樣才能做到實時變化:
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
//用三個變數作為引數
view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
這裡的cameraPos仍然是攝像機的位置向量,而cameraFront則是當前攝像頭鏡頭的朝向方向,cameraUp仍然是上向量。 由於lookAt函式接受的第二個引數是目標
1.2真實的FPS——不能飛行
為了讓攝像機系統更符合實際,也就是不能隨意飛行,我們需要設定攝像機的位置的y座標始終是一個固定值,也就是說只在x軸與z軸上活動,但視角仍然是可以隨意轉動的。這就需要在處理WASD的函式中將Position.y始終置為0.0f 。
void ProcessKeyboard(Camera_Movement direction, float deltaTime) { float velocity = MovementSpeed * deltaTime; if (direction == FORWARD) //真正的FPS攝像機(也就是說不能夠隨意飛行) Position += Front * velocity; if (direction == BACKWARD) Position -= Front * velocity; if (direction == LEFT) Position -= Right * velocity; if (direction == RIGHT) Position += Right * velocity; //不能隨意飛行 Position.y = 0.0f; }
2.程式碼及執行結果
完整的程式碼點選這裡,給出的是一個真正的FPS攝像機(也就是說不能夠隨意飛行),視角可以隨意轉動,但是移動的時候只能在一個平面。
執行結果如下圖所示: 通過 WASD移動並輔以滑鼠轉動視角則如下圖所示:
正確的程式應當使我們能夠隨意轉動視角,但只能在一個平面移動。