3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
|
|
1 | |
Выделение объектов сцены центром экрана посредством камеры03.12.2017, 17:06. Показов 1955. Ответов 13
Метки нет (Все метки)
Ку-ку, кодеры! Использую OpenGL 3.3+ c GLFW + GLSL. Пишу это все на C++ в QT Creator. Пишу свою игрушку, практикуя там то, что я постепенно изучаю в OpenGL. У меня есть FPS-камера, сцена, где отрисовываются кубы. Все грани кубов параллельны соответствующим координатным осям. Камера может двигаться и вращаться. Задано это все в мировых координатах. Есть окно, которое имеет центр с координатамиWidth/2 и Height/2. Пусть это будет x и y соответственно. Хочу выявить, находится ли эта точка на том или ином отрисованном кубе, а далее проводить с ним какие-то действия. В дальнейшем планирую вводить освящение. Вопрос: Какой лучший способ выбрать и как это реализовать? Буду премного благодарен за помощь! Спасибо!
0
|
03.12.2017, 17:06 | |
Ответы с готовыми решениями:
13
Масштабирование камеры относительно сцены 2д Удаление объектов со сцены Фиксация объектов сцены Видеонаблюдение посредством веб-камеры |
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
|
|
04.12.2017, 13:29 | 2 |
Написать типовую ф-цию "пересечение луча с кубом" (на крайняк найти готовую). Центр экрана соответствует лучу (0, 0, -1, 0) в СК камеры. Домножив этот вектор на матрицу обратную model-view куба получаете его а модельных координатах куба. В общем, все почти так же как в предыдущей задаче.
Это упрощение сильно обедняет, но расчеты не становятся проще. Желание "начать с чего-то попроще" (да ну их, эти матрицы) вполне понятно и естественно. Но они все равно Вас "найдут", поэтому лучше не затягивать.
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 |
1
|
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
|
||||||
06.12.2017, 13:17 | 5 | |||||
Луч - это "половинка прямой", обычно задается точкой и вектором (необязательно единичным). Поскольку луч исходит из камеры, то в ее СК точка = (0, 0, 0), а напр-е и есть напр-е взгляда камеры, которое в ее СК = (0, 0, -1).
Не по теме: Примечание: строго говоря, это не всегда так, можно задать такую (кастомную) матрицу проекции, что центр экрана будет соответствовать др вектору. Но это надо сильно постараться, поэтому об этом можно пока забыть. А если уж делать "по всем правилам" то надо использовать gluProject/gluUnproject (в Qt есть удобные аналоги) для вычисления вектора.
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 | |||||
1) Матрица созданная lookAt переводит из мира в камеру. В OpenGL ее называют "view matrix" (матрица вида). Поэтому для перевода "из камеры в мир" надо использовать обратную матрицу. Пример
2) На всякий случай еще раз напомню что (0, 0, -1) - это вектор (а не точка). Ну ладно, получите точку и вектор в мире, дальше что? Здесь считать в мире не очень удобно Вопросик (для тех кто хочет докопаться): а почему в спецификации OpenGL ничего не говорится про мир и СК камеры, а просто
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 | |||||
Уравнение луча - не проблема в любой СК.
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 |
Да, только наоборот, т.к. операции записываются в обратном порядке. Это та матрица что Вы создаете чтобы нарисовать куб
1
|
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
|
||||||
26.12.2017, 21:25 [ТС] | 12 | |||||
Опять я в ступоре...
У меня получаются какие-то странные значения координат. Что я делаю:
0
|
1865 / 765 / 105
Регистрация: 01.10.2012
Сообщений: 4,133
|
|
27.12.2017, 12:11 | 13 |
1) инверсия матрицы - операция дорогая, поэтому делать ее дважды неграмотно, такой код неприятно "режет глаз".
2) зачем давать имя "Point2" если по смыслу это вектор? 3) Pont1 - координата, у нее w должно быть = 1, а у Вас ? Нет. Пишите авккуратнее, и все получится
0
|
3 / 3 / 0
Регистрация: 01.07.2017
Сообщений: 146
|
|
27.12.2017, 21:48 [ТС] | 14 |
А у меня 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 | |
27.12.2017, 21:48 | |
Помогаю со студенческими работами здесь
14
Выбор объектов сцены мышью Auto resize объектов сцены Видимость объектов сцены и их потомков классами Собрать со сцены упорядоченный массив объектов Подсчет людей в помещении посредством компьютерного зрения и камеры Узор из 24 эллипсов с центром узора в середине экрана Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |