簡體   English   中英

Opengl GLM 看看奇怪的行為

[英]Opengl GLM lookAt strange behaviour

目前我正在嘗試在我的游戲中實現太陽的陰影映射。 為此,我需要使用 glm 查看 function 從太陽的角度渲染場景。 這是我的代碼:

projection = glm::ortho<float>(-200, 200, -200, 200, -200, 400);
view = glm::lookAt(sun_pos_modelspace, -target_position_modelspace, glm::vec3(0, 1, 0)); // target needs to be negative for correct camera direction
final_matrix = projection * view; 

這很好用,因為在游戲開始時場景是從太陽的角度渲染的。 但是當我翻譯目標時,視圖矩陣似乎從它的原始眼睛 position (這是太陽的位置)移動。 我根本不想讓眼睛移動,我只想讓相機坐在太陽的 position 上,直接看向目標矢量。

我應該使用其他一些 glm function 來解決這個問題嗎? 還是我錯誤地使用了lookAt?

glm::lookAt的三個參數是eyecenterup 所以,你把眼睛放在任何你想要的地方,它不應該自己移動。 將它設置為太陽的位置看起來是正確的(但要確保它在世界坐標中)

什么看起來有點可疑是你的中心參數。 它應該是相機應該注意的點。 在那里否定一些世界位置對我來說沒有意義:)

你在屏幕上有任何東西的原因盡管這種否定可能是你的近平面( glm::ortho倒數第二個參數)。 通常,您希望在相機前看到物體的距離。 使用負值,您將看到相機后面的對象。

編輯:為了澄清,在正射投影中有負近平面是有意義的,我只是認為將太陽放在某個遙遠的位置更容易,然后讓它渲染在它前面的所有東西。 這可能會使概念更容易。

長話短說,盡量不要否定目標位置並對近平面使用一些正值。

我最近正在使用 glm::lookAt function 撕掉我的頭發。 我系統的攝像頭使用極坐標概念,其中攝像頭對象的 position 是目標坐標,而眼睛有偏移和方向。 我的坐標系 +x 向右,+y 向前,+z 向上; 因此,具有恆等旋轉的面向向量將是 (0, 1, 0)。 我在 LH 模式下使用 glm。

如果我將面向身份的相機的極距設置為 5,然后將視點計算為 (0, -5, 0) 並且面向向量為 (0, 1, 0) - 兩者都是正確的 - 但 glm:: lookAt 會給我一個視點矩陣,視點位於 (0, 5, 0) 並面向 (0, -1, 0)...所以我會從錯誤的一側看到場景。 這通過渲染具有紋理的面以顯示它們所在的一側的立方體得到證實,然后在 RenderDoc 中進一步測試(通過存儲延遲照明的世界坐標,我可以看到結果像素在哪里)。

跳過 glm::lookAt 中的設置和向量生成代碼(因為我預先計算了朝向、右和上向量),這是我自己寫的以糾正問題:

view[0][0] = right.x;
view[1][0] = right.y;
view[2][0] = right.z;
view[3][0] = 0;
view[0][1] = up.x;
view[1][1] = up.y;
view[2][1] = up.z;
view[3][1] = 0;
view[0][2] = -facing.x;
view[1][2] = -facing.y;
view[2][2] = -facing.z;
view[3][2] = 0;
view[3][0] = dot(right, -eyepos);
view[3][1] = dot(up, -eyepos);
view[3][2] = dot(facing, -eyepos);
view[3][3] = 1;

請注意與 glm 的區別:

  • 將 view[3][0]、view[3][1] 和 view[3][2] 設置為 0,而不是 1
  • 否定 eyepos,而不是點積結果

鑒於帖子太舊了,這可能對 OP 的用處有限,但我今天剛剛解決了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM