没有W的屏幕位置不投影

时间:2014-07-24 22:15:28

标签: opengl mouse-picking

我理解如何取消投影的基本概念:

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坐标 - 当我将事物从世界空间渲染到屏幕空间时,由于透视变换(https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml),它们最终得到W != 1。当我从屏幕空间转换回世界空间(假设为W=1)时,对象处于错误的位置。

据我了解,W是所有其他坐标的缩放系数。如果是这种情况,是不是意味着屏幕向量(0, 0, -1, 1)(0, 0, -2, 2)将映射到相同的窗口坐标,并且如果没有进一步的工作,未投影不一定产生独特的结果?

谢谢!

1 个答案:

答案 0 :(得分:2)

由于透视转换,您无法忽略W.

我建议查看gluUnproject函数herehttp://www.opengl.org/wiki/GluProject_and_gluUnProject_code的源代码。你会看到它的作用是:

  1. 计算投影* modelView矩阵并将其反转。
  2. 乘以从屏幕位置制作的矢量(在代码中,winZ = 0将对应于近平面,winZ = 1对应于透视投影的远平面; W将始终为1)。
  3. 将计算出的矢量X,Y和Z除以W。
  4. 请注意,如果你这样做,结果的W应该被忽略(即假设为1)。

    您还可以查看here以查看OpenGL中的转换是如何工作的 - 如果您对此不熟悉,我建议您阅读有关剪辑坐标和规范化设备坐标的信息。