2012-01-26 52 views

回答

4

我沒有實現一個,沒有。我甚至不知道你可以將它分解成原始媒介,就此而言。 lookAt點可能位於沿原始射線的任何位置,您將如何確定合適的向上矢量是什麼?我想這是一個單向算法(只是懶得證明它!)

除此之外,然而,我懷疑你是否想要做到這一點,即使有一種方法。我敢打賭,跟蹤你使用的值並操縱它們,而不是試圖將它們從矩陣來回拖到向量和後面,這幾乎總是更有利的。

2

沒有:是的,你可以反轉模型視圖轉換並且沒有,你不會得到確切所有這三個矢量是相同的。

lookAt的模型視圖轉換與CSG模型中使用的connectTo操作非常相似。它將您的場景安裝在相機前。這是通過平移和三軸旋轉完成的。 eye點被翻譯爲(0,0,0)並且圍繞它進行所有進一步的旋轉。通過用逆矩陣變換(0,0,0),可以輕鬆導出視點。

但是,中心點僅用於調整沿軸的視圖軸。在openGL中,眼睛正面臨着-Z。中心和眼睛之間的距離丟失。所以如果你自己定義距離,你可以很容易地沿着你的視軸獲得一箇中心點。假設我們需要距離d。然後我們只需要用逆矩陣變換(0,0,-d),我們得到一個有效的中心點,但不完全相同。中心點僅限定兩個旋轉角度,即攝像機搖攝和傾斜。

更糟糕的是重建矢量。它僅用於相機的側傾角,因此僅用於一個標量值。因此,對於逆變換,您不僅可以選擇沿Y軸的任何正值,還可以選擇YZ平面中具有正Y值的任意點。爲了得到完全垂直於觀察軸且尺寸爲1的向上矢量,我們只需將(0,1,0)與逆矩陣變換。記住這次轉換爲矢量(而不是點)。

現在我們有眼睛,中心和向上重建,以便下次獲得完全相同的結果lookAt。但由於這個矩陣只包含6個信息值(平移,平移,傾斜,滾動),所以我們必須選擇丟失的3個值(距離眼睛中心,相機YZ平面上向量的大小和角度)。

模型視圖矩陣當然可以做其他轉換(任何仿射),但lookAt函數僅將該矩陣用於平移和旋轉。它正在調整相機前面的場景而不會使其失真。