2014-07-24 49 views
0

我明白如何unproject的基本概念:屏幕位置逆投影,而不W¯¯

let mut z = 0.0; 
gl::ReadPixels(x as i32, y as i32, 1, 1, gl::DEPTH_COMPONENT, gl::FLOAT, &z); 

// window position to screen position 
let screen_position = self.to_screen_position(x, y); 
// screen position to world position 
let world_position = self.projection_matrix().invert() * 
     Vector4::new(screen_position.x, screen_position.y, z, 1.0); 

但是,這並不需要在W座標正確 - 當我呈現來自世界空間的東西到屏幕空間,他們最終與W != 1,因爲角度轉換(https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml)。當我從屏幕空間轉換回世界空間時(假設爲W=1),對象位置錯誤。

據我所知,W是所有其他座標的縮放因子。如果是這種情況,是不是意味着屏幕矢量(0, 0, -1, 1)(0, 0, -2, 2)將映射到相同的窗口座標,並且未投影不一定會產生獨特的結果,而沒有進一步的工作?

謝謝!

回答

2

由於透視變換的,你真的不能忽視W.

我建議看源代碼,gluUnproject功能herehttp://www.opengl.org/wiki/GluProject_and_gluUnProject_code。你會看到這樣做的是:

  1. 計算投影* modelView矩陣並將其反轉。
  2. 將從屏幕位置(在代碼中,winZ = 0將對應於近平面,winZ = 1到透視投影的遠平面; W將始終爲1)乘以一個向量。
  3. 由W.

需要注意的是,如果你不喜歡這樣,結果的W¯¯應該被忽略除以計算的向量的X,Y和Z(即假定爲1)。

你也可以看看here看看OpenGL工作中的轉換 - 如果你不熟悉這個,我建議閱讀關於剪輯座標和標準化設備座標。