Обратная проекция в OpenGL

Делаю картографическое приложение с перспективной проекцией. Хочу, имея экранные координаты (клик мыши, например) получить координаты модели. (т.е. координаты на карте в данном случае).
Изучив метод QVector3D QVector3D::unproject(const QMatrix4x4 &modelView, const QMatrix4x4 &projection, const QRect &viewport) const написал следующую функцию, которая должна возвращать координаты в model-space. Но она всегда возвращает координаты центра экрана (+- несколько пикселей). Видимо работает неправильно. Если камера просто смотрит на карту под прямым углом, без поворота по осям Z и X, то результат обратной проекции по идее должен быть равен своему же аргументу, но данная функция все-равно вернет центр экрана, даже если на входе будет (0,0).

QVector2D Viewport::ray(const QPoint &p)
    {
    
        QMatrix4x4 proj;
        float aspect = (float)width / height;
        float fov = 50;
        proj.perspective(-fov, -aspect, 1, vp->height*10);
    
        QMatrix4x4 view;
        float cx = width/2;
        float cy = height/2;
        float angRad = 50 * DEGREES_TO_RADIANS;
        float depthZ = vp->height / (2.0 * tan( angRad / 2.0 ));
    
        view.lookAt({cx,cy,depthZ},{cx,cy,0},{0,1,0});
    
        view.translate(vp->width/2,vp->height/2,0);
        view.rotate(m_pitch,1,0,0);
        view.rotate(vp->getRotation(),0,0,1);
        view.translate(-vp->width/2,-vp->height/2,0);
    
        QVector3D in{(float)p.x(),(float)p.y(),0};
    
        QRect rect{0,0,width,height};
        auto out = in.unproject(view,proj,rect);
    
        return out.toVector2D();
    }

Ответы (0 шт):