我正在創建一個基於軟件的3D渲染器來學習概念和數學。這很有趣,我有一個很好的旋轉立方體在一個網格頂部作爲一種地板。網格/樓層使用線段進行渲染。我有一個使用簡單的查看轉換定位和定位的虛擬相機。觀察平面任意設置在與「眼睛」相距n的位置,或者在z = -n
處。我應該如何處理剪切到觀看平面的3D點的投影?
除了一件事以外,一切正常(從對象到世界到相機空間,剔除,項目,剪輯,渲染)。渲染網格時,線段端點可能會跨越虛擬相機的查看平面。我想渲染可見的部分,以便剪切到查看平面。剪輯的端點投影到查看平面。投影如下:
p'(x) = -n * p(x)/p(z)
p'(y) = -n * p(y)/p(z)
所有可能顯示的點將有p(z) ≤ -n
。被剪切到觀看平面的點有p(z) = -n
。因此,我有效:
p'(x) = p(x)
p'(y) = p(y)
對於這樣一個點;一個正交投影。
這裏的值可以很容易地位於查看平面上的窗口之外,這會導致視口轉換將這些點發送出OS窗口的界限。其效果是我看到雜亂的線條週期性地飛來飛去。這太糟糕了。
簡直就像說OpenGL那樣做(我只是使用OpenGL!),我錯過了什麼?
謝謝(如果你做到了這一點!)。
下面是顯示異常的截圖。網格的右上角不在視野內。朝向網格左側角落的線段位於相機後面,因此被裁剪。終點經歷了(錯誤的)正投影,並在左場結束。
我沒有做任何視錐體剔除(還)。也許我應該?
我遵循你的邏輯,但對我來說,你似乎不應該有一個直線正投影這些點! – 2011-12-16 06:32:06
這個問題混合了一些問題1)你混合了在窗口之外和觀點之後的話題。 2)你提到了正射投影,但這看起來是一個與透視投影有關的問題。 – ideasman42 2016-12-28 04:41:38