Transform screen coordinates to OpenGL coordinates

Transform screen coordinates to model original coordinates

QVector3D OpenGLScene::GetOGLPos(float winX, float winY,
                 const QMatrix4x4 projectionM,
                 const QMatrix4x4 viewM,
                 const QMatrix4x4 modelM
                 )
{
    QVector3D worldCoordinates;
    winZ = 1.0;
    // Compute (projection x modelView) ^ -1:
    const QMatrix4x4 m = ( projectionM * viewM * modelM).inverted();

    // Need to invert Y since screen Y-origin point down,
    // while 3D Y-origin points up (this is an OpenGL only requirement):
    winY = height() - winY;
    glReadPixels( winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
    // Transformation of normalized coordinates between -1 and 1:
    QVector4D in;
    in.setX( winX / width()  * 2.0 - 1.0 );
    in.setY( winY / height() * 2.0 - 1.0 );
    in.setZ( 2.0 * winZ - 1.0 );
    in.setW( 1.0 );

    // To world coordinates:
    QVector4D out(m * in);
    if (out.w() == 0.0) // Avoid a division by zero
    {
        worldCoordinates = QVector3D(0.0, 0.0, 0.0);
    }

    out.setW( 1.0 / out.w() );
    worldCoordinates.setX(out.x() * out.w());
    worldCoordinates.setY(out.y() * out.w());
    worldCoordinates.setZ(out.z() * out.w());
    return worldCoordinates;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值