2013-06-19 27 views
1

的目標是讓在投影攝像機屏幕上的三維空間中的點(最終目標是產生一個點雲)3D圖形 - 矢量數學,我似乎得到一些錯誤

這是設置:

相機 現在的位置是:PX,PY,PZ 上行方向:UX,UY,UZ look_at_direction:LX,LY,LZ SCREEN_WIDTH SCREEN_HEIGHT screen_dist

點在空間: p =(X,Y,Z)

而且

初始化U,V,W

w = || position - look_at_direction || = || (px,py,pz) - (ux,uy,uz) || 
u = || (ux,uy,uz) cross-product w || 
v = || w cross-product u || 

這使我的U,V,W的相機COORDS。

這是我應該實施的步驟,以及我理解他們的方式。我相信翻譯中丟失了一些東西。

(1)求從照相機至點

射線我減去與攝像機的位置

ray_to_point = P上的點 - 位置

(2)計算的內積將光線照射到屏幕的中心(照相機方向),並將標準化的光線照射到屏幕的中心。將結果除以sc_dist。 這會給你一個點的距離和相機屏幕距離之間的比例。

比=(ray_to_point * W)/ screen_dist

這裏我不知道我應該使用w或原來的樣子,在攝像機或瓦特載體,其爲在相機空間的單位矢量的值。 (3)將光線除以步驟2中找到的比例,並將其添加到相機位置。這會給你在相機屏幕上的投影點。 point_on_camera_screen = ray_to_point /比

(4)求攝像機的屏幕的中心和投影點之間的矢量。 我應該找到屏幕的中心像素嗎?我怎樣才能做到這一點?

謝謝。

+0

screen_coords = projection_matrix * modelview_matrix * your_vector_in_3d_space(可能是回到前面) – 2013-06-19 09:24:37

回答

1

考慮以下圖:

Figure

的第一步是計算從照相機至p (=> diff`差矢量)。這是正確的。

下一步是在相機的座標系中表示差異向量。由於它的軸是正交的,所以可以用點積來完成。可以肯定的軸是單位矢量:

diffInCameraSpace = (dot(diff, u), dot(diff, v), dot(diff, w)) 

現在來縮放部,使得所得到的差矢量具有的screen_dist的z分量。所以:

diffInCameraSpace *= screenDist/diffInCameraSpace.z 

你不想把它變回世界空間。您可能需要一些關於相機單元如何映射到像素的更多信息,但在這一步基本完成。您可能需要將生成的diffInCameraSpace移動(screenWidth/2, screenHeight/2, 0)。忘記z分量,並在屏幕上顯示位置。