2016-08-01 102 views
1

目前我正試圖在我的遊戲中實現太陽的陰影貼圖。爲此,我需要使用glm的功能來從太陽的角度渲染場景。這裏是我的代碼:Opengl GLM lookAt奇怪的行爲

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; 

這工作正常,因爲場景是從太陽的角度呈現,當遊戲開始時。但是當我翻譯目標時,視圖矩陣似乎從其原來的眼睛位置(這是太陽的位置)移動。我不想讓眼睛移動,我只想讓相機坐在太陽的位置,直接朝向目標矢量。

我是否應該使用其他一些glm函數來解決這個問題?或者我用錯了嗎?

+1

我不知道你使用的是什麼版本的glm,但是在0.9.7中我發現lookat()的行爲並不像它的假設。我建議你自己計算LookAt –

+1

@MichaelIV:那聽起來很奇怪,glm已經存在了很長一段時間,並且通常很穩定......你應該爲此打開一個錯誤報告,否則它不能被修復。 – karyon

+1

我使用更類似於你可以在gluLookAt()中找到的smth。我不明白爲什麼在GLM中他們在翻譯部分做點。我也不否定Z,因爲我的前鋒是積極的(與GL缺省相反) –

回答

0

glm::lookAt的三個參數是eye,centerup。所以,你把眼睛放在任何你想要的地方,而且它本身不應該移動。將它設置爲太陽的位置看起來是正確的(但要確保它在世界座標中)

看起來有點腥的是你的中心參數。它應該是相機應該看的點。否定一些世界的位置在那裏沒有任何意義:)

儘管否定可能是你的近平面(倒數第二個參數在glm::ortho),你屏幕上有什麼東西的原因。通常,這是您希望物體在相機前可見的距離。使用負值時,您會看到相機後面的物體。

編輯:爲了說明一下,在正交投影中預計有負面的近平面是有意義的,我只是覺得在較遠的地方使太陽更容易,然後讓它呈現它前面的所有東西。這可能會使這個概念更容易。長話短說,儘量不要否定目標位置,併爲近平面使用一些正值。

+0

非常感謝@karyon它的工作! – Jas