2013-08-19 85 views
2

在函數D3DXMatrixLookAtLH()的描述中,x軸等於「normal(cross(UpVec,z-axis))」,因爲我們知道z軸是正常的結果(AtVec-EyePosVec),大部分時間,我們可以計算矩陣沒有任何問題。關於攝像機功能D3DXMatrixLookAtLH()in Direct3D

但是,UpVec通常是(0,1,0),在特殊情況下,z軸和UpVec可以並聯。所以,(我認爲)不能建立右相機基礎,因爲Y軸和X軸將載體。那麼,我們該如何解決這個問題呢?或者我有什麼問題?

回答

2

爲了定義需要計算的正交基的視圖變換。這是一組彼此垂直並且具有單位長度的基矢量。

的單位長度準則可以通過歸一化矢量可以容易地實現。

橫產品用於使矢量正交。正如你已經提到,X向量進行正交第一,之後上矢量由正交化它重新計算。

x軸(右方向)總是取決於視線方向和所述向上矢量。如果我們假設(0,1,0)的上向量,則x軸僅取決於視圖方向。以下是一些例子(視圖方向總是在相同的平面中)

View visualization

你看到的是,當觀看方向穿過向上向量和改變其側右邊矢量翻轉。這就是爲什麼如果向上矢量和視圖方向平行,計算失敗的原因。沒有辦法確定右向量應該指向哪裏(導致零交叉產品)。如果使用這些矢量渲染場景,您會注意到,當視圖方向通過向上矢量時,圖像將水平翻轉。

如果要指定平行於y軸的方向視圖,你必須提供非平行向上矢量。有了這個可以計算出一個合理的右向量。

當然,你可以,如果你想解決某個向右向量與up = cross(direction, right)計算了載體。

+0

你提到我自己可以提供向上矢量時平行於y軸視圖方向。它有很多幫助。但是在這裏還有一個問題:我只是提供一個不平行的向量,無論我喜歡什麼?或者當視圖方向不平行於y軸時,是否有一些先前的選擇,如(0,1,0)? – ZengCheng

+0

您提供的向上矢量將在投影后指向屏幕的頂部。基本上,這是相機的滾動旋轉。 –

1

所以(我認爲)我們不能建立一個正確的相機基礎,因爲y軸 和x軸將是零向量。

是的,這會發生在您製作如下特例時。

lookAt = D3DXVector3(0, 0, 0); 
eyePos = D3DXVector3(0, Y, 0); 

把它準確,結果不是不正確的矩陣,它只是一個矩陣,您將看到您的場景與它的注意。

那麼,如何才能解決這個問題?

您應該採取防止這種情況發生的響應。