Russian Qt Forum

Qt => OpenGL => Тема начата: Kinley11 от Октябрь 30, 2023, 13:19



Название: Получение локальных координат объекта
Отправлено: Kinley11 от Октябрь 30, 2023, 13:19
Всем привет. Вопрос в следующем. Имеется некий 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. Понимаю, что похоже что-то не учитываю в преобразовании или не делаю еще какую то операцию. Надеюсь, подскажите правильный путь.



Название: Re: Получение локальных координат объекта
Отправлено: kambala от Октябрь 31, 2023, 11:27
может дело в вертикальном угле 38 градусов в матрице проекции? по картинке кажется, что у нас угол 0 градусов.

(я ненастоящий сварщик)


Название: Re: Получение локальных координат объекта
Отправлено: Igor_S от Ноябрь 01, 2023, 19:22
Код:
        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));
Y перевернута (см описание unproject). Z = 1 соответствует задней стенке фрустума, Z = 0 передней. У Вас Z = 3, нормируйте на nearRes, farRes, они те самые что даете в метод perspective, пере-вычислять не нужно.

В обоих случаях Вы получили верный луч/вектор, но у Вас перспективное изображение, т.е. чем дальше объект от камеры (чем больше Z) - тем он меньше и больше прижимается к центру экрана. Зачем Вам перспектива в 2D сцене - не знаю. Для расстояния 3

0.314589/x = -0.949228/-3, ну x и будет примерно 1

(я ненастоящий сварщик)
Так можно ж "просто пройти дальше по ссылке"  :)