攝像機 LookAt矩陣 視角移動 尤拉角

2022-06-09 11:09:08 字數 2372 閱讀 9795

一: 攝像機

攝像機位置:攝像機位置簡單來說就是世界空間中乙個指向攝像機位置的向量。

glm::vec3 camerapos = glm::vec3(0.0f, 0.0f, 3.0f);

攝像機方向:這裡指的是攝像機指向哪個方向。現在我們讓攝像機指向場景原點:(0, 0, 0)。

2.1 用場景原點向量減去攝像機位置向量的結果就是攝像機的指向向量。

2.2 由於我們知道攝像機指向z軸負方向,但我們希望方向向量(direction vector)指向攝像機的z軸正方向。如果我們交換相減的順序,我們就會獲得乙個指向攝像機正z軸方向的向量:

glm::vec3 cameratarget = glm::vec3(0.0f, 0.0f, 0.0f);//表示攝像機指向的地方,即原點。

glm::vec3 cameradirection = glm::normalize(camerapos - cameratarget);//方向向量,與指向的方向相反的向量

2.3方向向量:(與實際指向的方向相反)方向向量(direction vector)並不是最好的名字,因為它實際上指向從它到目標向量的相反方向(注意看前面的那個圖,藍色的方向向量大概指向z軸的正方向,與攝像機實際指向的方向是正好相反的)。

右軸:需要的另乙個向量是乙個右向量(right vector),它代表攝像機空間的x軸的正方向。為獲取右向量我們需要先使用乙個小技巧:先定義乙個上向量(up vector)。接下來把上向量和第二步得到的方向向量進行叉乘。兩個向量叉乘的結果會同時垂直於兩向量,因此我們會得到指向x軸正方向的那個向量(如果我們交換兩個向量叉乘的順序就會得到相反的指向x軸負方向的向量):

glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); 

glm::vec3 cameraright = glm::normalize(glm::cross(up, cameradirection));

上軸:已經有了x軸向量(cameraright)和z軸向量(cameradirection),獲取乙個指向攝像機的正y軸向量就相對簡單了:我們把右向量和方向向量進行叉乘:

glm::vec3 cameraup = glm::cross(cameradirection, cameraright);

二:lookat矩陣

使用矩陣的好處之一是如果你使用3個相互垂直(或非線性)的軸定義了乙個座標空間,你可以用這3個軸外加乙個平移向量來建立乙個矩陣,並且你可以用這個矩陣乘以任何向量來將其變換到那個座標空間。

有了3個相互垂直的軸和乙個定義攝像機空間的位置座標,可以建立自己的lookat矩陣

lookat矩陣就像它的名字表達的那樣:它會建立乙個看著(look at)給定目標的觀察矩陣。

位置向量在矩陣中運算時時相反的:因為我們最終希望把世界平移到與我們自身移動的相反方向。

glm::lookat函式需要乙個位置、目標和上向量。它會建立乙個和在上一節使用的一樣的觀察矩陣。(根據以上的分析,有了這三個向量足以構建出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));//上向量

攝像機類裡面返回的觀察矩陣定義如下:

view = glm::lookat(camerapos, camerapos + camerafront, cameraup);
這裡的目標位置改成了攝像機位置加上方向向量glm::vec3 camerafront = glm::vec3(0.0f, 0.0f, -1.0f);)這樣做可以保證,攝像機始終注視著目標方向。

三: 視角移動

為了能夠改變視角,我們需要根據滑鼠的輸入改變camerafront向量(上面說的方向向量:cameradirection)。

尤拉角:俯仰角(pitch)、偏航角(yaw)和滾轉角(roll)

2.1 俯仰角(pitch):如何往上或往下看的角,繞x軸

2.2 偏航角(yaw):偏航角表示我們往左和往右看的程度,繞y軸

2.3 滾轉角(roll):如何翻滾攝像機,繞z軸

攝像機中的基礎矩陣

基礎矩陣也叫做基本矩陣。基礎矩陣描述的是影象點與其對應極線的對應關係。也就是說基礎矩陣是極幾何的代數表示。基礎矩陣的推導方式比較難看懂。具體的可以參考吳福朝的計算機視覺中的數學方法。這本書很不錯,特別推薦。在理解基礎矩陣之前要先搞懂攝像機投影關係和極幾何的知識。如上圖,i,i 為兩個攝像機的成像平面...

Unity 判斷物體是否在攝像機視角內

2d物體和3d物體的渲染是不一樣的 3d物體依靠meshrender,而2d靠的是canvas統一渲染 判斷3d物體 內建的api onbecamevisible 當指令碼掛載的物體呈現在任何相機時呼叫一次 onbecameinvisible 當指令碼掛載的物體離開任何相機時呼叫一次 原理 相機進行...

攝像機標定

利用攝像機所拍攝到的影象來還原空間中的物體。在這裡,不妨假設攝像機所拍攝到的影象與三維空間中的物體之間存在以下一種簡單的線性關係 像 m 物 這裡,矩陣m可以看成是攝像機成像的幾何模型。m中的引數就是攝像機引數。通常,這些引數是要通過實驗與計算來得到的。這個求解引數的過程就稱為攝像機標定。中文名 攝...