Opengl 不带W的屏幕位置未投影

Opengl 不带W的屏幕位置未投影,opengl,mouse-picking,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 wo

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

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
,因为透视变换()。当我从屏幕空间转换回世界空间时(假设
W=1
),对象位于错误的位置

据我所知,
W
是所有其他坐标的比例因子。如果是这种情况,难道这不意味着屏幕向量
(0,0,-1,1)
(0,0,-2,2)
将映射到相同的窗口坐标,如果不进行进一步的工作,取消投影不一定会产生唯一的结果吗


谢谢

由于透视变换,您不能真正忽略W

我建议查看
glunproject
函数的源代码:。您将看到它的作用是:

  • 计算投影*模型视图矩阵并将其反转
  • 将屏幕位置生成的向量相乘(在代码中,winZ=0对应于透视投影的近平面,winZ=1对应于透视投影的远平面;W始终为1)
  • 将计算出的向量的X、Y和Z除以W
  • 请注意,如果这样做,则应忽略结果的W(即假定为1)

    您还可以查看OpenGL中的转换是如何工作的——如果您不熟悉这一点,我建议您阅读有关剪辑坐标和规范化设备坐标的内容