2010-07-15 44 views
6

因此,我正在編寫我自己的自定義3D轉換管道,以便更好地瞭解它是如何工作的。我可以正確地將所有內容渲染到屏幕上,而我現在要回去看剪輯。透視後的Z值總是小於-1

根據我的理解,如果透視分割後的x或y值超出[-1,1]的範圍,我應該剪裁一個頂點,在我的情況下,如果z值超出[ 0,1]。

當我實現這個,但是,我的z值總是-1.xxxxxxxxxxx其中xxxxxxx是一個非常小的數字。

這有點長,我很抱歉,但我想確保我提供了所有可能的信息。

首先約定:

我使用左手系統,其中,矩陣是這樣的:

[m00, m01, m02, m03] 
[m10, m11, m12, m13] 
[m20, m21, m22, m23] 
[m30, m31, m32, m33] 

我的向量列看起來像這樣:

[x] 
[y] 
[z] 
[w] 
我的 相機設置有:

以弧度/ 4爲單位的垂直FOV。

的縱橫比1(方視口)

1.

一種近鉗定值的1000

初始世界x位置遠裁值

初始世界y位置爲0.

初始世界z位置爲-500。

照相機向下看的位置Z軸(0,0,1)

給定一個頂點,所述管道是這樣的:

步驟1:乘頂點由攝像機矩陣。

步驟2:將頂點乘以投影矩陣。

投影矩陣爲:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

步驟3:乘以X,由1/W y和z分量。

第4步: [這是問題所在]如果有外界限制,則剪切頂點。

第5步:轉換爲屏幕座標。

一個例子頂點,我已是

(-100, -100, 0, 1) 

相機矩陣相乘後我得到:

(-100, -100, 500, 1) 

這是有道理的,因爲相對於相機,該頂點是100個單位的向左和向下,並提前500個單位。這也是1近剪裁和1000 W的遠裁之間仍爲1

通過投影矩陣相乘後我得到:

(-241.42135, -241.42135, 601.600600, -600.600600) 

這我不知道,如果它使感。 x和y似乎是正確的,但是我認爲z和w是因爲下一步的視角分裂是奇怪的。

在透視分割後獲得:

(0.401966, 0.401966, -1.001665, 1) 

再次x和y是有意義的,它們都允許的範圍內[1,1]。但是z值顯然超出了界限,儘管我認爲它應該仍然在最內部。 W回到1,這又有道理。

再次爲小說道歉,但我希望有人能幫我弄清楚我做錯了什麼。

謝謝!

回答

3

好你的視錐內

嘗試用一個採樣點z座標,用說z座標,它看起來像我想通了,問題是什麼是。

我的投影矩陣是:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

但它確實應該換位和爲:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, -1.001001] 
[0,  0,  1,   0] 

當使用這種矩陣,我的X和Y值保持不變的預期,現在我的z值被限制在[0,1]之內,並且如果它們在遠剪切平面附近以外,則僅超過該範圍。

現在唯一的問題是我很困惑我是否使用右手或左手系統。

我所知道的是,現在它工作...

+0

好東西。我很高興聽到你知道'')' – 2010-07-16 17:27:04

+0

感謝您的幫助,但我非常感謝。 – Jon 2010-07-16 18:29:15

2

我可能不在這裏,但我認爲投影矩陣和視角鴻溝的目的是發現屏幕上該點的2D位置。在這種情況下,剩餘的z值不一定具有任何意義,因爲數學全都適用於找到這兩個x和y值。

更新:我想我已經想通了。你的數學是完全正確的。您所描述的攝像機和frustum在Z = 1處有一個近剪裁平面,因此您的示例指向(-100,100,0)實際上是剪裁平面的以外的,因此z緩衝區值恰好低於-1非常有意義。 2.

+0

Hmmn,好吧我猜這是有道理的,因爲渲染仍然是正確的。但是我不需要那個z值來存儲在我的深度緩衝區中嗎?如果我存儲它,是否不需要在[0,1]或至少[-1,1]的範圍之間? – Jon 2010-07-15 15:38:59

+0

看看http://www.gamedev.net/community/forums/topic.asp?topic_id=483363。我認爲你可能不得不在*除以w之前進行剪裁。在這種情況下,您可以在裁剪算法中計算z緩衝區值,其中它只是z/1500(在您的示例中)。 – 2010-07-15 17:29:23

+0

這是另一個:http://www.codermind.com/articles/Depth-buffer-tutorial.html – 2010-07-15 17:34:02