1. 程式人生 > >LearnOpenGL學習筆記(七):一個FPS攝像機系統

LearnOpenGL學習筆記(七):一個FPS攝像機系統

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函式接受的第二個引數是目標

向量,故需要將cameraPos向量與cameraFront向量求和,才能得到代表目標位置的向量,如下圖所示: 在這裡插入圖片描述 cameraPos代表的攝像頭的位置向量,cameraFront代表的是攝像機鏡頭朝向的方向,將這兩個向量相加才是我們想要的目標向量(可以理解成獲得了鏡頭目標的世界座標)。

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移動並輔以滑鼠轉動視角則如下圖所示: 在這裡插入圖片描述

正確的程式應當使我們能夠隨意轉動視角,但只能在一個平面移動。