2017-07-17 37 views
2

是否有辦法將這些數據轉換:轉換XYZ到XY(世界COORDS篩選COORDS)

  • 對象位置,這是一個三維點(X,Y,Z),
  • 攝像頭位置,這是3D點(X,Y,Z),
  • 照相機偏航,俯仰,滾動(-180:180,-90:90,0)
  • 視場(-45°:45°)
  • 屏幕寬度&高度

進入屏幕上的2D點(X,Y)?

我正在根據這一組確切的數據尋找適當的數學計算。

+0

是的,有一種方法。但是,您需要更具體地瞭解「屏幕寬度和高度」等內容。但是你也需要向我們展示一些你在這個問題上所做的研究和工作,並解釋爲什麼這是一個編程問題而不是數學問題。 –

+0

您正在尋找透視投影...請參閱[數學計算一個簡單的圖形管道](https://stackoverflow.com/a/21100338/2521214) – Spektre

+0

[基本渲染3D透視投影到相機的2D屏幕上的可能的副本(沒有opengl)](https://stackoverflow.com/questions/8633034/basic-render-3d-perspective-projection-onto-2d-screen-with-camera-without-openg) – meowgoesthedog

回答

1

這很難,但它有可能這樣做對你自己。

有很多是爲你做這個庫的,但如果你自己做更令人滿意:

這個問題是可能的,我一直在使用寫我自己的3D引擎爲對象,這在javascriptHTML5 Canvas。你可以看到我的代碼here,並解決了我寫下here的3D迷宮遊戲,試圖理解我將在下面談論什麼......

基本思路是逐步工作。要開始,你必須忘記攝像機角度(yaw, pitch and roll),因爲這些會遲一些,只是想象你正在往下看y axis。然後基本思想是使用trig,計算俯仰角和偏航到你的物體座標。通過這個我的意思是想象你正在通過一個信箱看,偏航角度是從中心/中線到你的座標左右的角度(所以既有正面也有負面),以及偏航角度。取這些角度,可以將它們映射到x和y二維座標系。

用於角度的計算是:

pitch = atan(coord.x - cam.x/coord.y - cam.y) 
yaw = atan(coord.z - cam.z/coord.y - cam.y) 

coord.x, coord.y and coord.z作爲對象的用於凸輪的座標和相同的(cam.x, cam.y and cam.z)這些計算還假設使用的是笛卡爾座標系與不同軸爲:z upy forwardx right

從這裏開始,下一步就是將3D世界中的這個角度映射到可用於2D圖形表示的座標。

要將這些角度映射到屏幕中,您需要將它們縮放爲距中線的距離。這意味着將它們乘以您的screen width/fov。最後,這些距離現在是正值或負值(因爲它是從中線開始的角度),所以要真正將其繪製在畫布上,您需要將其添加到屏幕寬度的一半。

那麼這將意味着你的畫布座標將是:

x = width/2 + (yaw * (width/fov) 
y = height/2 + (yaw * (height/fov) 

其中widthheight是你的尺寸絲網,fov是相機的FOV和yawpitch是對象的各個角度上的相機。

您現在已經實現了將3D座標映射到2D的第一大步驟。如果你已經設法使這一切工作,我會建議嘗試多個點,並連接它們形成形狀。另外,請嘗試移動相機位置,以瞭解視角如何變化,因爲您很快會看到它看起來有多現實。另外,如果這對你來說工作得很好,你可以繼續讓相機不僅能夠改變它在3D世界中的位置,而且還可以改變其角度,如yaw, pitch and roll角度。我現在不會完全理解,但基本思想是使用3D世界變換矩陣。你可以閱讀關於他們here但他們確實變得相當複雜,但是如果你得到這些,我可以給你計算。