math - OpenGL 数学 - 将屏幕空间投影到世界空间坐标

标签 math opengl matrix

今天结束时是时候做一点数学了..

我需要投影窗口大小的 4 个点:

<0,0> <1024,768>

进入世界空间坐标,因此它将形成一个四边形形状,稍后将用于地形剔除 - 没有 GluUnproject

仅用于测试,我使用鼠标坐标 - 并尝试将它们投影到世界坐标上

最佳答案

已解决

以下是如何一步步准确完成此操作。

  1. 获取客户区域内的鼠标坐标
  2. 如果不需要模型矩阵,请获取投影矩阵和 View 矩阵。
  3. 多重投影 * 查看
  4. 对乘法结果求逆
  5. 构造一个由以下内容组成的向量4

    x = mouseposition.x 在窗口 x 范围内

    • 转换为 -1 到 1 之间的值

    y = mouseposition.y 在窗口 y 范围内

    • 转换为 -1 到 1 之间的值
    • 如果需要,请记住反转 mouseposition.y

    z = 深度值(可以使用 glReadPixel 获得)

    • 您可以手动从 -1 到 1(zNear、zFar)

    w = 1.0

  6. 将向量乘以之前创建的逆矩阵

  7. 将矩阵乘法后的结果向量除以它的 w 分量(透视除法)

        POINT mousePos;
        GetCursorPos(&mousePos);
        ScreenToClient( this->GetWindowHWND(), &mousePos );         
    
        CMatrix4x4 matProjection = m_pCamera->getViewMatrix() *  m_pCamera->getProjectionMatrix() ;
    
        CMatrix4x4 matInverse =  matProjection.inverse();
    
    
        float in[4];
        float winZ = 1.0;
    
    
        in[0]=(2.0f*((float)(mousePos.x-0)/(this->GetResolution().x-0)))-1.0f,
        in[1]=1.0f-(2.0f*((float)(mousePos.y-0)/(this->GetResolution().y-0)));
        in[2]=2.0* winZ -1.0;
        in[3]=1.0;          
    
        CVector4 vIn = CVector4(in[0],in[1],in[2],in[3]);
        pos = vIn * matInverse;
    
        pos.w = 1.0 / pos.w;
    
        pos.x *= pos.w;
        pos.y *= pos.w;
        pos.z *= pos.w;
    
        sprintf(strTitle,"%f %f %f / %f,%f,%f ",m_pCamera->m_vPosition.x,m_pCamera->m_vPosition.y,m_pCamera->m_vPosition.z,pos.x,pos.y,pos.z);
    
        SetWindowText(this->GetWindowHWND(),strTitle);
    

关于math - OpenGL 数学 - 将屏幕空间投影到世界空间坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692988/

相关文章:

algorithm - 半方差的鲁棒在线算法

opengl - 在 WebGL 中重现 Cinder 故障

opengl - OpenGL 中的 Gradient "miter"在连接处显示接缝

r - 如何矢量化这个循环?将两个矩阵相乘,存储信息,多次执行此操作而不循环

algorithm - 最小化最大成本

java - asin() 函数有问题

math - 如何实现数值稳定的加权 logaddexp?

java - 在 Java 中搜索符号形式的数学方程式

c++ - OpenGL绘制一个矩形填充窗口

python - 将文本文件读入矩阵 - python