Обратная проекция в 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();
}