Всем привет. Вопрос в следующем. Имеется некий 2д объект, он расположен в диапазоне координат -1 до 1. В мировом пространстве он также располагается в этих координатах, но z смещен на -3 единицы.
Собственно инициализация матриц модели, вида и проекции:
m_model.setToIdentity();
m_view.setToIdentity();
m_projection.setToIdentity();
m_model.translate({0.0, 0.0, -3.0});
m_projection.perspective(38.0, 1.0 * 640 / 480, 0.1, 100.0);
При щелчке по крайней правой границе моей окружности на экране я хочу получить ее координату, x = 1.0, так как r = 1.0.
Пробовал несколько способов, дающих один и тот же результат, но не совсем правильный для меня.
1) Ray picking:
QMatrix4x4 mat = m_view * m_projection * m_model;
QMatrix4x4 invMat = mat. inverted() ;
//расчет нормализованных координат х, y, где был клик
float pt_x = (p.x()/640)*2.0f - 1.0f;
float pt_y = -(p.y()/480)*2.0f + 1.0f;
QVector4D nearPlane(pt_x,pt_y, -1.0, 1.0);
QVector4D farPlane(pt_x, pt_y, 1.0, 1.0);
QVector4D nearRes = invMat * nearPlane;
QVector4D farRes = invMat * farPlane;
nearRes /= nearRes.w();
farRes /= farRes.w();
QVector3D direc = QVector3D(farRes - nearRes);
//результирующий вектор
direc.normalize();
2) Unproject
QVector3D screenPos(p.x(),p.y(),1.0f); // p.x, p.y экранные координаты клика
QVector3D vecUnproj = screenPos.unproject(m_view, m_projection,QRect(0,0, 640, 480));
vecUnproj.normalize();
Output:
direc = QVector3D(0.314588, 0, -0.949228)
unproject = QVector3D(0.314589, 0, -0.949228)
В итоге у результирующего вектора полученный x = 0,31 c копейками, а ожидалось что-то около 1.0. Понимаю, что похоже что-то не учитываю в преобразовании или не делаю еще какую то операцию. Надеюсь, подскажите правильный путь.