2010-11-03 75 views
6

我想了解glLookAt函數。OpenGL LookAt函數:是向上的向量是任意的嗎?

它需要3個三胞胎。第一個是眼睛的位置,第二個是眼睛凝視的點。那一點會出現在我的視口的中心,對吧?第三個是'向上'向量。我理解'向上'向量的意義,如果它垂直於從眼睛到眼睛的向量。問題是,是否允許指定其他向量,如果是,那麼意義是什麼?

指向gluPerstpectiveglLookAtglFrustum的圖形詳細說明的鏈接也將非常感謝。官方OpenGL文檔似乎不適用於新手。

請注意,當垂直於眼睛 - >對象向量時,我理解向上向量的含義。問題是什麼意思(如果有的話),如果不是。我無法用參數來玩弄。

+0

非常感謝大家。每個答案都有一些有用的信息。我的問題得到解答。謝謝 – 2010-11-03 11:57:50

回答

10

只要它與向上矢量「充分垂直」,它就會工作。重要的是在矢量矢量和查看矢量之間的平面。

如果這兩個對齊,上行方向將會或多或少是隨機的(基於值的非常小的位),因爲它的小調整將使其指向查找表的上/左/右,在向量。

如果它們具有足夠大的分離角度(在32位浮點數學中),它將很好地工作。這個角度通常不會超過一度左右,所以它們可以非常接近。但是,如果差異降低到幾位,每個改變位都會產生巨大的直接變化。

歸結爲數值精度。

(我敢肯定有更多的數學術語這個&定義,但是它已經從大學幾年.. :)

一錘定音:如果向量是平行的,那麼向上方向是完全未定義的,你會得到一個退化的視圖矩陣。

+0

謝謝。你可以看看我對奧斯曼的回答的評論嗎?你是這個意思嗎? – 2010-11-03 11:34:54

+0

他在說的是,如果您的向上向量是(0,1,0),並且您決定對準您的眼睛和對象,以使眼睛 - >對象的法線(或非常接近)(0,1,0 )你會發現相機可以旋轉或旋轉到一個不確定的角度。我在實踐中發現,雖然這種情況沒有發生,但我從來沒有把兩者聯繫起來解決這個問題。 – thecoshman 2010-11-03 11:41:49

+0

@阿門:正確。隨着投影變小(當向上和向後的矢量變爲共線時),投影的方向(這是重要的)將隨着任一矢量的小變化而突然改變。只有這樣你纔會遇到問題。 – Macke 2010-11-03 11:54:12

0

是的。它是任意的,它可以讓你的相機「滾動」,即看起來好像場景圍繞眼軸旋轉。

+0

我的意思是我知道只要它垂直於眼軸,它是任意的,但是什麼時候不是?我仍然沒有想象的意思... – 2010-11-03 11:07:08

2

在這個網站上,你有一個偉大的教程

http://www.xmission.com/~nate/tutors.html

http://users.polytech.unice.fr/~buffa/cours/synthese_image/DOCS/www.xmission.com/Nate/tutors.html

下載的可執行文件,並可以更改參數的值到glLookAt功能,看看什麼情況」即時的」。

+0

謝謝!這真的很有幫助! – 2010-11-03 11:15:31

+0

並一如既往與鏈接的內容:「錯誤404 - 找不到文檔」 – Kromster 2015-09-25 08:28:53

+1

@KromStern,感謝您指出。我已用新鏈接更新了答案。 – bruno 2015-09-25 11:02:29

3

向上的向量讓openGL知道你的相機有什麼方式。

想想在真實的世界裏,如果你必須指向空間,你可以畫出一條線。然後,您可以對齊一個對象,例如相機,以便它從一個指向另一個。但是你無法知道你所反對的東西應該圍繞該線所做的軸旋轉。向上矢量指示相機應該站在哪個方向。

大多數情況下,向上的向量將是(0,1,0),這意味着相機將像您平常拿着相機一樣旋轉,或者如果您將頭向上伸直。如果你設置你的向量(1,0,0),就好像把你的頭放在一邊,所以從你的頭部到頭頂,它指向右邊。你仍然從同一點(或多或少)看同一點,但你的'上'已經改變。 (0,-1,0)的外觀向量會使相機朝下,就像你在哪裏做一個手架。

你可以考慮一個方法,你的手臂是從相機位置(你的肩膀)到相機看點(你的食指)的矢量,如果你堅持你拇指出來,這是你的向上的向量。

這張圖片可以幫助你http://images.gamedev.net/features/programming/oglch3excerpt/03fig11.jpg

EIDT

垂直與否。

我明白你現在要問什麼。例如,你在(10,10,10)看(0,0,0)所得到的向量爲你的方向爲(-10,-10,-10),與此垂直的向量對於你向上glLookAt,如果你想讓視圖定位,以便你像普通人一樣俯視一下,只需將你的向量設置爲(0,1,0),實際上,除非你想能夠滾動相機,你不需要這樣做是不可能的。

+0

非常感謝,但是我仍然不明白,如果向上矢量不垂直於從一個物體到另一個物體的矢量,會產生什麼樣的影響 – 2010-11-03 11:23:03

+0

假設A是垂直於眼睛 - >物體矢量的平面。你是說只有向上A向量上的投影很重要嗎? – 2010-11-03 11:29:25

+0

恩......讓我想一想。是的,我認爲。我可以肯定地說,眼睛 - >對象點真的急劇上升或下降,同樣的向上的矢量仍然有效。我不需要處理垂直於我的外觀矢量的東西,如果openGL需要這個,那麼它就會自己爲你工作(對你而言) – thecoshman 2010-11-03 11:38:46

-4

走出去,看看月亮。地平線位於底部。將頭向左傾斜,地平線向右旋轉。向上矢量是你頭部的方向。

+0

無論我傾斜頭部,向上矢量仍將垂直於自身 - >月亮矢量。我的問題是什麼,當它不是 – 2010-11-03 11:24:21

+0

不知道你爲什麼想使它變得複雜,但它肯定會計算正常。只有向上向量與視圖向量匹配時,它纔會失去控制。 – 2010-11-03 11:46:58

1

向上向量不需要垂直於看的方向。只要它不平行(或非常接近於平行),你應該沒問題。假設你有一個視圖平面法線,N(視向)和一個向上的向量(它不能平行於N),UV可以計算實際的向上矢量,它將在相機變換中使用首先計算向量V = UV - (N * UV)N。 V反過來用於計算實際向上矢量,通過創建一個與N和V垂直的向量,如U = N×V。