【问题标题】:Screen space to world space屏幕空间到世界空间
【发布时间】:2021-04-07 17:08:52
【问题描述】:

我正在用 C++ 制作一个绘图程序,但不知道如何从屏幕空间转换到世界空间

我可以访问投影和视图矩阵以及屏幕尺寸等

这是我正在使用的代码,但它不起作用

没有错误,但它根本不输出世界空间坐标,它只是稍微改变了所有像素坐标

我正在关注我在这里找到的答案OpenGL Math - Projecting Screen space to World space coords

我现在只使用正交相机

glm::mat4 proj = cameraComp.Camera.GetProjection();
glm::mat4 view = glm::translate(glm::mat4(1.0f), transformComp.Position)
       * glm::rotate(glm::mat4(1.0f), glm::radians(transformComp.Rotation.z), glm::vec3(0, 0, 1));

glm::mat4 inversed = glm::inverse(proj * view);

glm::vec4 worldPos = { newMousePos, 0, 1 };
worldPos *= inversed;

【问题讨论】:

    标签: c++ opengl glm-math


    【解决方案1】:

    视图矩阵从世界空间转换为视图空间。因此,逆视图矩阵从视图空间变换到世界空间。
    投影矩阵从视图空间变换到剪辑空间,逆投影矩阵从剪辑空间变换到视图空间。剪辑空间是一个Homogeneous coordinate 系统。为了从剪辑空间转换到标准化设备空间,您必须执行Perspective divide。规范化的设备空间是Cartesian coordinates系统。因此,如果要从归一化的设备空间变换到视图空间,则需要通过逆投影矩阵进行变换,并通过 w 分量将 x、y 和 z 分量相除。
    另见OpenGL - Mouse coordinates to Space coordinates

    由于您使用的是 GLM,我建议使用 glm::unProject 进行转换。

    【讨论】:

      【解决方案2】:

      它不是 GLM,而是任何类型的数学库的更常见的风格

      // make cursor coordinates from -1 to +1
      float pt_x = (point.x / screenSize.x) * 2.f - 1.f;
      float pt_y = -(point.y / screenSize.y) * 2.f + 1.f;
      
      //                       z value from 0.f to 1.f for d3d
      vec4 origin = math::mul(vec4(pt_x, pt_y, -1.f, 1.f), VPinv);
      origin.w = 1.0f / origin.w;
      origin.x *= origin.w;
      origin.y *= origin.w;
      origin.z *= origin.w;
      

      当您的相机被修改以提高性能时,您只需计算一次 ViewProjectInvert 矩阵。

      void camera::update(){
          ....
          m_viewProjectionMatrix = m_projectionMatrix * m_viewMatrix;
          m_viewProjectionInvertMatrix = m_viewProjectionMatrix;
          m_viewProjectionInvertMatrix.invert();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多