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

Выделение объектов сцены центром экрана посредством камеры

03.12.2017, 17:06. Показов 1955. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ку-ку, кодеры!

Использую OpenGL 3.3+ c GLFW + GLSL. Пишу это все на C++ в QT Creator. Пишу свою игрушку, практикуя там то, что я постепенно изучаю в OpenGL.

У меня есть FPS-камера, сцена, где отрисовываются кубы. Все грани кубов параллельны соответствующим координатным осям. Камера может двигаться и вращаться. Задано это все в мировых координатах. Есть окно, которое имеет центр с координатамиWidth/2 и Height/2. Пусть это будет x и y соответственно. Хочу выявить, находится ли эта точка на том или ином отрисованном кубе, а далее проводить с ним какие-то действия. В дальнейшем планирую вводить освящение.

Вопрос: Какой лучший способ выбрать и как это реализовать?

Буду премного благодарен за помощь! Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2017, 17:06
Ответы с готовыми решениями:

Масштабирование камеры относительно сцены 2д
Приветствую! Делаю 2Д игру. Некий платформер, но карта вся на экране, т.е. не перематывается. Как...

Удаление объектов со сцены
Привет! Есть сцена, на ней клонируются объекты. Нужно: при нажатию левой кнопки по объекту,...

Фиксация объектов сцены
Как зафиксировать объекты сцены (У меня например TextField и Password field ,ну и кнопки) по...

Видеонаблюдение посредством веб-камеры
Вот прикупил Веб камеру и общаюсь через нее в Скайпе, соотвественно включаю интернет. А можно не...

13
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
04.12.2017, 13:29 2
Написать типовую ф-цию "пересечение луча с кубом" (на крайняк найти готовую). Центр экрана соответствует лучу (0, 0, -1, 0) в СК камеры. Домножив этот вектор на матрицу обратную model-view куба получаете его а модельных координатах куба. В общем, все почти так же как в предыдущей задаче.

Цитата Сообщение от General_TaO Посмотреть сообщение
Все грани кубов параллельны соответствующим координатным осям.
Это упрощение сильно обедняет, но расчеты не становятся проще. Желание "начать с чего-то попроще" (да ну их, эти матрицы) вполне понятно и естественно. Но они все равно Вас "найдут", поэтому лучше не затягивать.
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
05.12.2017, 09:49  [ТС] 3
Что значит луч с координатами (0, 0, -1, 0)? Я понимаю это, как точку в пространстве... Прошу вас уяснить мне этот вопрос.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
05.12.2017, 10:32 4
а такое ?
https://triplepointfive.github... ial29.html
1
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
06.12.2017, 13:17 5
Цитата Сообщение от General_TaO Посмотреть сообщение
Что значит луч с координатами (0, 0, -1, 0)? Я понимаю это, как точку в пространстве... Прошу вас уяснить мне этот вопрос.
Луч - это "половинка прямой", обычно задается точкой и вектором (необязательно единичным). Поскольку луч исходит из камеры, то в ее СК точка = (0, 0, 0), а напр-е и есть напр-е взгляда камеры, которое в ее СК = (0, 0, -1).

Не по теме:

Примечание: строго говоря, это не всегда так, можно задать такую (кастомную) матрицу проекции, что центр экрана будет соответствовать др вектору. Но это надо сильно постараться, поэтому об этом можно пока забыть. А если уж делать "по всем правилам" то надо использовать gluProject/gluUnproject (в Qt есть удобные аналоги) для вычисления вектора.

Выглядит так
C++
1
2
3
4
float RayCubeIntersect( const vec3 & rayOrigin, const vec3 & rayDir, const Cube & cube, vec3 * normal = 0 )
{
 ...
}
Ф-ция возвращает -1 если луч не пересек куб, иначе расстояние от rayOrigin до ближайшей стенки куба. Часто нужен не только "факт пересечения" но и нормаль в точке пересечения. А используя матрицы Вы простым домножением легко получаете луч хоть в мировой СК хоть в модельной
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
24.12.2017, 16:17  [ТС] 6
Не буду создавать новую тему, поэтому спрошу здесь....

Я вот пытаюсь перевести точку с СК камеры в мировые координаты. Получается, мне надо перевести точки (0, 0, 0) и (0, 0, -1) и уже на их базе работать.

Какую матрицу мне использовать для переводов? У меня есть матрица lookAt но с ней получаются какие-то непропорциональные координаты. Это при последовательном умножении lookAt на вектор позиции камеры. Или я что-то не то делаю? А как перевести, например точку (0, 0, -1) в мировые координаты?
0
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
25.12.2017, 09:04 7
Цитата Сообщение от General_TaO Посмотреть сообщение
Какую матрицу мне использовать для переводов? У меня есть матрица lookAt но с ней получаются какие-то непропорциональные координаты. Это при последовательном умножении lookAt на вектор позиции камеры. Или я что-то не то делаю? А как перевести, например точку (0, 0, -1) в мировые координаты?
1) Матрица созданная lookAt переводит из мира в камеру. В OpenGL ее называют "view matrix" (матрица вида). Поэтому для перевода "из камеры в мир" надо использовать обратную матрицу. Пример
C++
1
2
3
4
5
6
7
8
QMatrix4x4 matrView, matrInvView;
matrView.lookAt(,,,);   // создаем матрицу "из мира в камеру"
matrInvView = matrView.inverted();  // получаем матрицу "из камеры в мир"
QVector4D pos(0, 0, 0, 1);   // позиция камеры в СК камеры
QVector4D dir(0, 0, -1, 0);   // вектор взгляда камеры в СК камеры
 
QVector3D posW = matrInvView * pos;  // позиция камеры в мировой СК
QVector3D dirW = matrInvView * dir;   // вектор взгляда камеры в мировой СК
Обратите внимание что для вектора w = 0 (будет применено только вращение)

2)
Цитата Сообщение от General_TaO Посмотреть сообщение
Я вот пытаюсь перевести точку с СК камеры в мировые координаты. Получается, мне надо перевести точки (0, 0, 0) и (0, 0, -1) и уже на их базе работать.
На всякий случай еще раз напомню что (0, 0, -1) - это вектор (а не точка). Ну ладно, получите точку и вектор в мире, дальше что? Здесь считать в мире не очень удобно

Вопросик (для тех кто хочет докопаться): а почему в спецификации OpenGL ничего не говорится про мир и СК камеры, а просто
gluLookAt — define a viewing transformation
?
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
25.12.2017, 09:21  [ТС] 8
Спасибо за разъяснение.
Я собираюсь использовать переведенные в СК мира точки для составления из них уравнения луча, которой я потом буду тестировать на столкновение с объектами. А есть и более выгодные способы?
0
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
25.12.2017, 10:57 9
Цитата Сообщение от General_TaO Посмотреть сообщение
Я собираюсь использовать переведенные в СК мира точки для составления из них уравнения луча, которой я потом буду тестировать на столкновение с объектами. А есть и более выгодные способы?
Уравнение луча - не проблема в любой СК.
C++
1
p = ray.pos + ray.dir * t
Где pos и dir = то что выше, а t - переменная, расстояние по лучу. Проблема в другом. Сравним 2 задачи

1) Центр кубикв в точке (0, 0, 0) и он выровнен по осям. Луч выходит из точки pos и имеет напр-е dir. Найти пересечение(я)
2) Центр кубикв в точке (x, y, z) и он как-то повернут по осям. Луч выходит из точки pos и имеет напр-е dir. Найти пересечение(я)

Очевидно вторая требует намного больше времени и кода. А ведь Вы легко можете свести дело к первой, просто используйте ModelView матрицу куба (вместо View матрицы в примере выше). И кубы у Вас смогут стоять как угодно (а не только по осям в мире)
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
25.12.2017, 11:45  [ТС] 10
ModelView матрица куба - это Model матрица куба, умноженная на View матрицу камеры, верно?
0
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
26.12.2017, 09:30 11
Цитата Сообщение от General_TaO Посмотреть сообщение
ModelView матрица куба - это Model матрица куба, умноженная на View матрицу камеры, верно?
Да, только наоборот, т.к. операции записываются в обратном порядке. Это та матрица что Вы создаете чтобы нарисовать куб
1
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
26.12.2017, 21:25  [ТС] 12
Опять я в ступоре...

У меня получаются какие-то странные значения координат. Что я делаю:

C++ (Qt)
1
2
3
 glm::mat4 ModelView = camera.View * cube.Model
 glm::vec4 Point1 = inverse(ModelView) * vec4(0.0f);
 glm::vec4 Point2 = inverse(ModelView) * vec4(0.0f, 0.0f, -1.0f. 0.0f);
В итоге у меня Point1 = (0,0,0), а Point2 имеет просто значения наклона камеры от -1 до 1. Это нормально или я опять что-то скопытил?
0
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
27.12.2017, 12:11 13
1) инверсия матрицы - операция дорогая, поэтому делать ее дважды неграмотно, такой код неприятно "режет глаз".
2) зачем давать имя "Point2" если по смыслу это вектор?
3) Pont1 - координата, у нее w должно быть = 1, а у Вас ?

Цитата Сообщение от General_TaO Посмотреть сообщение
В итоге у меня Point1 = (0,0,0).... Это нормально.. ?
Нет. Пишите авккуратнее, и все получится
0
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
27.12.2017, 21:48  [ТС] 14
Цитата Сообщение от Igor3D Посмотреть сообщение
а у Вас ?
А у меня w = 0. И в первом, и во втором случае...

Добавлено через 1 час 51 минуту
А вот моя модельная матрица моего кубика с координатами(0,-4,-10, 1)... Может в ней что-то не так?
[ 1 0 0 0 ]
[ 0 1 0 0 ]
[ 0 0 1 0 ]
[ 0 -4 -10 1]

В общем... Никакие это не значения поворота. При умножении, хотя-бы, inverse(View) на Point2 я получаю координаты точки в системе координат камеры. А что, если я это полученное значение прибавлю к camera.Position? Получу ли я точку в мировых координатах?

Добавлено через 4 часа 32 минуты
Я нашёл свою ошибку. В третей строчки своего кода надо было умножать на вектор с координатой w=1
0
27.12.2017, 21:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2017, 21:48
Помогаю со студенческими работами здесь

Выбор объектов сцены мышью
Есть сцена с шарами. Нужно реализовать возможность выбора шара мышью. Находил примеры, но они...

Auto resize объектов сцены
Здравствуйте форумчане. Пишу 2D игру для андроид и ios и столкнулся с такой проблемой, элементы...

Видимость объектов сцены и их потомков классами
добрый день, очень надеюсь на вашу помощь. Ситуация следующая: есть два класса Unit и Floor....

Собрать со сцены упорядоченный массив объектов
На сцене есть 14 точек (см. скрин), как их упорядочить в массиве от _targetPoint до...

Подсчет людей в помещении посредством компьютерного зрения и камеры
Пытаюсь написать программу для подсчета людей в помещении (кабинет в офисе, аудитория со...

Узор из 24 эллипсов с центром узора в середине экрана
Помогите, пожалуйста нарисовать узор из 24 эллипсов с центром узора в середине экрана. Радиусы...


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

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