2011-03-13 41 views
-3

假設攝像機位於(0,0,1)點處,看着原點。 -z方向正在進入屏幕。超出z = -100的對象不可見(遠景平面)。在遠視平面上,x和y在右邊爲100,在左邊爲-100,對於x軸也是如此,對於y軸也是如此。如何將3d點更改爲2d像素位置?

視口窗口寬度爲600像素,像素高度爲300像素。在二維像素座標(x2d,y2d)上,(0,0)是左上角,x2d向右增加,y2d向下增加。

給出上面的參數,給定點(x,y,z)計算(x2d,y2d)的公式是什麼?每個3d點映射到一個像素,除非3d點被剪切(在視口中不可見)。 假設透視投影。

請不要提供關於3D投影理論的鏈接。我正在尋找特定的解決方案來解決這個特定的問題。

+4

http://en.wikipedia.org/wiki/3D_projection – 2011-03-13 09:48:43

+0

這似乎是一個功課問題?我建議你把三角學教科書拿出來。 – Ben 2011-03-13 10:26:00

+0

這不是一個家庭作業問題。編程和編碼問題。 – ace 2011-03-13 11:09:30

回答

2

如果您只想從3D位置查找2D屏幕位置,那麼如果您知道類似的三角形,就很容易。不需要觸發器。只需構成一些變量,即與屏幕上的像素之間的距離(以像素爲單位) - 稱爲focal_length。你可以調整這個數字,使它看起來更逼真(看起來太矮看起來很有彈性)

這個解決方案是用於向前看x的,向後看只是需要和額外的線來消極的z,這在我的謙卑中是不必要的複雜性意見,但我不知道你的目的。你的範圍之外

第一夾出像素(只需使用一對夫婦的if語句我不會僞說出來的。)

然後自己在3D世界中的位置:

x0 = x - yourx 
y0 = y - youry 
z0 = z - yourz 

(在你的例子yourx = 0, youry = 0, yourz = -1

然後離開項目:

x2d = focal_length * x0/z0 
y2d = focal_length * y0/z0 

簡單吧?我只是想通過考慮火車軌道,現在想做一個基本的3D遊戲;)

如果你想進入3D旋轉或隱藏面孔等數學......這是當事情變得..棘手。根據你的屏幕座標的方式,你可能需要在x2d或y2d方程中的一個或另一個或兩個上都有負號。呃你知道了。

1

我建議你從這裏開始:

http://msdn.microsoft.com/en-us/library/bb206269(v=vs.85).aspx

通過閱讀,它會給你如何將所有的座標轉換工作是個好主意。它是一個很好的解釋:)

編輯:你問的具體問題是巨大的。該鏈接爲您提供瞭如何讓自己進入投影空間的解釋。你也可能想看看視口(http://msdn.microsoft.com/en-us/library/bb206341(v=VS.85).aspx)。一旦將座標變換後的透視投影映射到2d平面,只需將得到的w座標除以x,y和z即可。

對不起,如果這不夠好,但它是一個非常複雜的一塊數學。雖然我理解它,但是我需要幾個小時才能親自解釋這一切,並且通過堆棧溢出的方式,我不太可能會把我的觀點貫穿於整個過程。上面的MSDN鏈接將讓您全面瞭解3D轉換管道,如果您閱讀它們。

+0

問題很明顯,我不在尋找一個鏈接(它甚至沒有提到3d到2d轉換!)。我正在尋找針對我在問題中精確描述的特定問題的具體解決方案)。 – ace 2011-03-13 10:17:26

+0

@alan,在我看來,確切的具體解決方案在維基百科參考文獻中給出。你甚至檢查過它嗎?同樣的msdn鏈接。你看過嗎?我很想知道這些引用如何解決您的具體問題。 – 2011-03-13 10:22:01

+0

@Alan:足夠公平我已經在我的帖子中提供了一點細節,但是你問的問題是waaaay在堆棧溢出帖子中巨大地回答。對不起,如果這不符合你的批准,但恐怕你必須做大量的閱讀,然後才能掌握3D轉換。 – Goz 2011-03-13 10:24:02

2

這應該解釋一切:

視野是屏幕的限制。在Minecraft中,FOV在整個屏幕上都是70度。

該點在y或z平面(如果向下看x軸)有多遠的角度,並且是您計算的任何平面的x/y或x/z的反正切值。之後,只需將點的位置調整爲相對於眼睛的位置和方向。通過使用角度的正弦並進行一些數學運算來調整眼睛方向的相對位置。繪製出來總是有幫助的。一個好的diagram from the Wikipedia article on 3D projection

enter image description here

我不會給你這種情況的代碼,但是這應該給你一個良好的開端。