OpenGL基礎14 攝像機

2021-10-06 12:08:40 字數 2587 閱讀 4819

很可惜,opengl沒有攝像機的概念

我們當然需要想辦法模擬出乙個攝像機,也就是玩家的視角,在前面這一章:第乙個正方體,我們僅將「攝像機」往z軸正方向移動了3個單位,並且正對著(0, 0, 0),但是大部分的情況下,類似於我們處於乙個3d場景中,攝像機的視角都是從上斜向下的,這個時候若想要計算攝像機的位置和方向資訊,就是需要一定的運算了

既然攝像機如此重要,我們當然需要知道它的很多資訊,包括:

攝像機位置

觀察方向(攝像機z軸)

垂直於觀察方向,指向攝像機右側的向量(攝像機x軸)

垂直於觀察方向,指向攝像機正上方的向量(攝像機y軸)

對於①:必定是你來確定,又或者由輸入確定(通過移動滑鼠調整視角等),對於②:只要將攝像機的座標減去焦點的座標就可以了,在遊戲中,這個焦點往往是玩家自己的世界座標,而這裡我們就當作是原點(經過如此計算得出來的這個向量理論是攝像機z軸的負方向)

glm::vec3 cameratarget = glm::vec3(0.0f, 0.0f, 0.0f);

glm::vec3 cameradirection = glm::normalize(camerapos - cameratarget);

對於③④,如果你對施密特正交化比較了解,那麼應該就很容易通過公式得出對應的向量,不了解也沒有關係,想要得到③的向量,我們只需要將y軸正方向向量(0, 1, 0)和攝像機z軸向量叉乘就可以,這個向量必定同時垂直於前兩者,至於是x軸正方向還是負方向取決與叉乘的順序,可以用右手定則得出,④同理

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

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

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

有了上面的所有資訊後,我們就可以計算出攝像機的觀察矩陣了

可以發現,上面的②③④向量相互垂直,它們構成了乙個全新的向量空間,這樣的話,我們只需要再有乙個平移向量就可以輕鬆的建立乙個矩陣,後面對於每乙個頂點,我們只需要用這個矩陣乘以它就能將其變換到對應觀察空間,這便是lootat矩陣:

其中

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矩陣,其中傳入的第乙個引數為攝像機位置,第二個引數為目標位置,第三個引數為你所描述的世界空間的上向量(就是上面的(0, 1, 0)了)

看上去貌似沒有什麼區別,但是這個物體其實是靜止的,是我們觀察者的位置在改變

攝像機標定

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

監視攝像機

時間限制 1 sec 記憶體限制 32 mb 題目描述 乙個著名的倉庫管理公司 erkoi請你的公司為其安裝一套閉路監視系統。由於 serkoi財力有限,每個房間只能安裝一台攝像機作監視用,不過它的鏡頭可以向任意方向旋轉。房間用乙個封閉的多邊形表示,一條邊表示一面牆。輸入 輸入檔案包含乙個或多個房間...

攝像機標定

攝像機鏡頭的畸變 由於攝像機光學系統並不是精確地按理想化的小孔成像原理工作,存在有透鏡畸 變,物體點在攝像機成像面上實際所成的像與理想成像之間存在有光學畸變誤差。主要的畸變誤差分為三類 徑向畸變 偏心畸變和薄稜鏡畸變。第一類只產生徑向 位置的偏差,後兩類則既產生徑向偏差,又產生切向偏差,下圖2 為無...