openGL射线选择

时间:2014-03-05 02:06:42

标签: c++ opengl math

一般射线拾取过程应如下(实验结果证明是正确的):

  1. 将屏幕指向转换为规范化设备空间方向向量:

    float x = (2.0f * mouse_x) / width - 1.0f;
    float y = 1.0f - (2.0f * mouse_y) / height;
    float z = 1.0f;
    vec3 ray_nds = vec3 (x, y, z);
    
  2. 将方向向量转换为均匀剪辑坐标

    vec4 ray_clip = vec4 (ray_nds.xy, -1.0, 1.0);
    
  3. 将方向矢量转换为眼睛空间方向矢量

    vec4 ray_eye = inverse (projection_matrix) * ray_clip;
    
  4. 将方向矢量转换为世界空间,获取具有世界空间相机位置和方向矢量的拾取光线

  5. 我的问题是,在规范化的设备空间中,为什么方向向量的z分量是1.0? 我的意思是,在OpenGL规范化设备空间中,xyz分量应该都在-1~1的范围内,因此摄像机应该在z = -1的平面中心。因此方向向量应为:查看目标位置 - 摄像机位置,z分量应为1 - ( - 1)= 2.0f。 (在DirectX标准化设备空间中,xy分量在-1~1范围内,z分量在0~1范围内,摄像机位置应该在平面z = 0的中心,比如说,(0, 0,0),方向矢量的z分量应为1-0 = 1)

2 个答案:

答案 0 :(得分:1)

ray_nds.z完全无关紧要,因为你还是不使用它。那是因为你不知道像素的深度。

ray_clip不是方向,而是投影后近剪裁平面(z = -1)上的位置。如果撤消此投影(使用反投影矩阵),最终会在相机空间中显示相同的点。在相机空间中,相机以(0, 0, 0)为中心。可以使用ray_eye - (0, 0, 0)计算光线的方向矢量,ray_eye基本上是(0, 0, -infinity)。因此,如果我们忽略w分量,我们可以将位置用作方向。这只适用于相机空间!剪辑空间和世界空间最有可能将投影中心放在其他地方。

请勿在不同的空间混淆相机位置。在相机空间中,它位于原点。在剪辑空间中,可以假设它在(x, y, ...)。点{{1}}只是相应像素所涵盖的任意点。你需要其中任何一个来定义射线。

答案 1 :(得分:0)

相机不在z = -1(或0),它甚至落后于此。

near clip plane位于z = -1。这使得这种数学的所有复杂性成为可能,因为所有方程都涉及如果跟踪会使得曲线不能通过0.因此我们总是会携带大量的znzm。 / p>

检查出方程式4.2:http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html

更可怕但更完整:http://www.songho.ca/opengl/gl_projectionmatrix.html

更多链接: http://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-opengl-matrix-maths/

http://schabby.de/projection-matrix/