Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 85
1

Перевод из оконных координат в мировые

01.05.2018, 07:14. Показов 6505. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Знаю, что конечная матрица, выходящая на экран, формируется следующим образом
MVPmatrix = projection * view * model;
Пытаюсь преобразовать экранные координаты в мировые. Нашёл в интернете функцию, которая возвращает координаты пересечения с плоскостью, но он написана на ES, в принципе, там ничего такого сверхъестественного нет, но вот функцию getViewMatrix() не видит. Поэтому вопрос, как мне получить видовую матрицу? И вообще имеет ли смысл данный код?

P.S.: Я не использую шейдеры

C++
1
2
3
4
5
6
7
8
9
10
11
12
QVector3D GLWidget::screenCoordsToWorldCoords(const QVector2D &mousePos)
{
    QVector4D tmp(2.0f * mousePos.x() / width - 1.0f, -2.0f * mousePos.y() / height + 1.0f, -1.0f, 1.0f); // Преобразование 'экранных координат к виду [-1;1]
    QVector4D iTmp((m_proj.inverted() * tmp).toVector2D(), -1.0f, 0.0f); // Преобразование 'экранных координат в систему координат камеры
    QVector3D Direction((m_camera.getViewMatrix().inverted()* iTmp).toVector3D().normalized()); //вектор направления клика миши
    QVector3D camPos(m_camera.getViewMatrix().inverted()* QVector4D(0.0f, 0.0f,0.0f,1.0f).toVector3D()); // позиция камеры в мировой системе координат
 
    QVector3D N(0.0f, 1.0f,0.0f); // Пересечение с плоскостью
    float t = -QVector3D::dotProduct(camPos, N)/ QVector3D::dotProduct(Direction, N);
    QVector3D result = camPos + Direction *t;
    return result;
}


вот всё, что производилось с матрицами, которые есть в моей программе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    QMatrix4x4 m_proj;
    QMatrix4x4 m_camera;
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLoadMatrixf(m_camera.data());
    m_camera.setToIdentity();
    m_camera.translate(15, 0, -101);
 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glLoadMatrixf(m_proj.data());
    m_proj.setToIdentity();
    m_proj.perspective(m_fovy, ratio, m_zNear, m_zFar);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2018, 07:14
Ответы с готовыми решениями:

Преобразование координат мыши в мировые координаты
Привет всем! Начал писать 3d игру и возникла проблема: преобразование координат. Дело в том, что я...

Получение оконных координат мыши (C++)
Подскажите, как можно получить оконные координаты мыши в НЕконсольном приложении Win32. Как я...

Преобразование оконных координат в левые
Вот я хочу написать морской бой,и нужно что бы при нажатии мышки проверялось поле.Но при...

Перевод в мировые координаты
Проблема такая: у меня есть координаты мыши: mousePos , есть матрица view - view, есть матрица...

6
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
01.05.2018, 14:39 2
Цитата Сообщение от Collision Посмотреть сообщение
вот всё, что производилось с матрицами, которые есть в моей программе
У тебя камера - это уже модельновидовая матрица.

gluProject and gluUnProject code.
Вот пример по gluUnproject.
0
61 / 58 / 11
Регистрация: 25.04.2017
Сообщений: 509
01.05.2018, 20:29 3
C++
1
2
vec4 pos = invert(camMat) * vec4(screenPos, 1);
vec3 worldPos= pos .xyz / pos .w;
Где vec3 screenPos - это оконные координаты, screenPos.z = глубина из буфера глубины * 2.0f - 1.0f (если glDepthRange не использовал), screenPos.x/.y оконные координаты от -1 до 1.

a mat4 camMat = projection * view;


Не по теме:

Вот эта тема уже сто раз поднималась.

1
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 85
01.05.2018, 21:49  [ТС] 4
EVP, Почему-то функция возвращает совсем не то значение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    GLint    viewport[4];    // параметры viewport-a.
    GLdouble projection[16]; // матрица проекции.
    GLdouble modelview[16];  // видовая матрица.
    GLdouble vx, vy, vz;       // координаты курсора мыши в системе координат viewport-a.
    GLdouble wx,wy,wz;       // возвращаемые мировые координаты.
 
    vy = event->y();
    vx = event->x();
    vz = 100;
 
    glGetIntegerv(GL_VIEWPORT, viewport);           // узнаём параметры viewport-a.
    glGetDoublev(GL_PROJECTION_MATRIX, projection); // узнаём матрицу проекции.
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview);   // узнаём видовую матрицу.
    gluUnProject(vx, vy, vz, modelview, projection, viewport, &wx, &wy, &wz);
 
    pt.setX(wx); // Возвращает значение от -1 до 1, 
    pt.setY(wy); // при умножении на 100 все равно получается не тот результат
Вот формула(1), которая переводит координаты мыши, в мировые координаты
C++
1
2
3
    
     QVector4D tmp(2.0f * event->x() / width - 1.0f, -2.0f * event->y() / height + 1.0f, -1.0f, 1.0f);
     QVector4D iTmp((m_proj.inverted() * tmp).toVector2D(), -1.0f, 0.0f);
Вывод в диалоговом окне значения возвращаемого из функции gluUnProject и мировых координат
C++
1
2
    QMessageBox::information(this, "Координаты", "x: " + QString::number(wx) + "(" + QString::number(iTmp.x()) + 
                                                    "); y: " +QString::number(wy)+"(" + QString::number(iTmp.y())+")");

1. В чем проблема с этой функцией?
2. Мне нужно найти координаты пересечения с плоскостью.
Допустим, я решил повернуть камеру, как показано на второй пикче. Координаты ( предположим это мировые) из формулы(1) не меняют положения, независимо от того под каким углом я эту камеру повернул или в какую сторону переместил.

То есть в коде, который я скинул в самый первый раз, вроде как первые две строчки работают нормально, а стальные, где начинается матрица m_camera - некорректно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
QVector3D GLWidget::screenCoordsToWorldCoords(const QVector2D &mousePos)
{
    QVector4D tmp(2.0f * mousePos.x() / width - 1.0f, -2.0f * mousePos.y() / height + 1.0f, -1.0f, 1.0f); // Преобразование 'экранных координат к виду [-1;1]
    QVector4D iTmp((m_proj.inverted() * tmp).toVector2D(), -1.0f, 0.0f); // Преобразование 'экранных координат в систему координат камеры
    QVector3D Direction((m_camera.getViewMatrix().inverted()* iTmp).toVector3D().normalized()); //вектор направления клика миши
    QVector3D camPos(m_camera.getViewMatrix().inverted()* QVector4D(0.0f, 0.0f,0.0f,1.0f).toVector3D()); // позиция камеры в мировой системе координат
 
    QVector3D N(0.0f, 1.0f,0.0f); // Пересечение с плоскостью
    float t = -QVector3D::dotProduct(camPos, N)/ QVector3D::dotProduct(Direction, N);
    QVector3D result = camPos + Direction *t;
    return result;
}
Миниатюры
Перевод из оконных координат в мировые   Перевод из оконных координат в мировые  
0
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
02.05.2018, 11:10 5
Цитата Сообщение от Collision Посмотреть сообщение
Почему-то функция возвращает совсем не то значение
Я же тебе пример специально дал, чтобы ты посмотрел. Пример работает правильно.
Функция простая и понятная - в ней нет ошибки.

Если у тебя эта функция не работает как ожидается, то проверь свои ожидания.
Пересчитай матрицы вручную, возми обратные,
проведи прямой расчёт и обратный, сравни результаты.

Посмотри на данные, которые ты даёшь функции, сравни с ожидаемыми.
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
02.05.2018, 19:32 6
Цитата Сообщение от Collision Посмотреть сообщение
Вот формула(1), которая переводит координаты мыши, в мировые координаты
QVector4D iTmp((m_proj.inverted() * tmp).toVector2D(), -1.0f, 0.0f);
В примере выше умножается перспективная матрица на видовую, потом инвертируется и умножается на ScreenSpace координаты мыши

Ты же инвертировал только перспективную, плюс в ScreenSpace ты не указал z координату. Плюс не поделил на гомогенную.
Читайте внимательно.
0
0 / 0 / 0
Регистрация: 21.01.2015
Сообщений: 85
02.05.2018, 20:15  [ТС] 7
Diochrome, Функция, которую я приводил в самом начале, работает, но только в перспективной проекции, а я до этого все с орографической возился.

C++
1
2
3
4
5
6
7
8
9
10
11
QVector3D GLWidget::screenCoordsToWorldCoords(const QVector2D &mousePos)
{
    QVector4D tmp(2.0f * mousePos.x() / width - 1.0f, -2.0f * mousePos.y() / height + 1.0f, -1.0f, 1.0f); // Преобразование 'экранных координат к виду [-1;1]
    QVector4D iTmp((m_proj.inverted() * tmp).toVector2D(), -1.0f, 0.0f); // Преобразование 'экранных координат в систему координат камеры
    QVector3D Direction((m_camera.getViewMatrix().inverted()* iTmp).toVector3D().normalized()); //вектор направления клика миши
    QVector3D camPos(m_camera.getViewMatrix().inverted()* QVector4D(0.0f, 0.0f,0.0f,1.0f).toVector3D()); // позиция камеры в мировой системе координат
    QVector3D N(0.0f, 0.0f,1.0f); // Пересечение с плоскостью
    float t = -QVector3D::dotProduct(camPos, N)/ QVector3D::dotProduct(Direction, N);
    QVector3D result = camPos + Direction *t;
    return result;
}
0
02.05.2018, 20:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2018, 20:15
Помогаю со студенческими работами здесь

Перевод из экранных координат (от -1 до +1)
Здравствуйте Не уверен что верно употребляю "экранные", на всякий случай уточню: в OpenGL это...

Перевод координат модели в растровые
Вопрос очень маленький : правильно ли я все понял? Чтобы получить РЕАЛЬНОЕ положение точки на...

Перевод координат в другую систем координат
как перевести плоские координаты хyz в другую систему координат x1y1z1 по трем и более точкам?

Перевод координат
Всем привет. У меня такой вопрос. Какие нужны формулы для переноса 3D в 2D. Задача стоит следующая:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru