Russian Qt Forum
Май 23, 2024, 18:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получение локальных координат объекта  (Прочитано 2733 раз)
Kinley11
Новичок

Offline Offline

Сообщений: 6


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

« Последнее редактирование: Октябрь 30, 2023, 13:51 от Kinley11 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #1 : Октябрь 31, 2023, 11:27 »

может дело в вертикальном угле 38 градусов в матрице проекции? по картинке кажется, что у нас угол 0 градусов.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igor_S
Новичок

Offline Offline

Сообщений: 9


Просмотр профиля
« Ответ #2 : Ноябрь 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

(я ненастоящий сварщик)
Так можно ж "просто пройти дальше по ссылке"  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 22.