我了解如何取消投影的基本概念:
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)
将映射到相同的窗口坐标,并且如果没有进一步的工作,非投影不一定会产生独特的结果?
谢谢!