因此,我正在編寫我自己的自定義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,這又有道理。
再次爲小說道歉,但我希望有人能幫我弄清楚我做錯了什麼。
謝謝!
好東西。我很高興聽到你知道'')' – 2010-07-16 17:27:04
感謝您的幫助,但我非常感謝。 – Jon 2010-07-16 18:29:15