Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2017, 11:15   #1
Delano
 
Регистрация: 10.12.2017
Сообщений: 4
Лампочка Перевод оконных координат в координаты мира

Здравствуйте, я делаю игру на OpenGL + GLFW3 + glew. Сейчас в моем арсенале имеется возможность управлять камерой FPS с помощью клавиш и отрисовывать кубики. Мне необходимо при нажатии мышкой на какой-либо отрисованный полигон узнать координаты точки прохождения луча камеры на плоскости объекта. Каким образом этого можно добиться? Я где-то нашел, что для этого необходимо перемножить некий вектор с обратной матрицей MVP, но проблема в том, что я при отрисовке нескольких (объектов) кубов использую MVP, которая относится конкретно в этому кубу. Т.е у меня нет общей MVP и интуитивно понятно, что если я возьму к примеру MVP[0] для вышеописанной махинации, то пользы мне это не даст. Правильно ли, что я рисую всё по очереди таким способом? Буду благодарен за внятную подсказку на оба вопроса.

Пример моего кода из основного цикла:

Цитата:
//------------------отрисовка первого куба
glm::mat4 Model1 = glm::translate(glm::mat4(1.0), glm::vec3(x1, y1, z1));;
glm::mat4 MVP1 = Projection * View * Model1;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP1[0][0]);
glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &Model1[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDrawArrays(GL_TRIANGLES, 0, vertices.size());
//------------------------- отрисовка второго куба
glm::mat4 Model2 = glm::translate(glm::mat4(1.0), glm::vec3(x2, y2, z2));;
glm::mat4 MVP2 = Projection * View * Model2;

glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP2[0][0]);
glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &Model2[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDrawArrays(GL_TRIANGLES, 0, vertices.size());
x,y,z - координаты центров кубов в мировом пространстве
через юниформ отправляю данные в вертексный шейдер
vertexbuffer - буфер вершин
uvbuffer - буфер координат текстуры
normalbuffer - буфер нормалей (для освещения)
Delano вне форума Ответить с цитированием
Старый 11.12.2017, 12:01   #2
coremission
Форумчанин
 
Аватар для coremission
 
Регистрация: 09.11.2017
Сообщений: 121
По умолчанию

Простым умножением матрицы не обойтись, если я правильно понял задачу. Нужно сделать ray-cast из камеры и найти точку пересечения. Нужен физический движок для этого. Или самому написать алгоритм пересечения луча с треугольной моделью.

Но может можно по-другому задачу решить, если вы расскажете в чем задача)
Профессионально программирую видео-игры. Пишу бекстейдж-блог о разработке игр CoreMission.net.
Разрабатываю календарь выхода игр.
coremission вне форума Ответить с цитированием
Старый 12.12.2017, 20:42   #3
Delano
 
Регистрация: 10.12.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от coremission Посмотреть сообщение
Простым умножением матрицы не обойтись, если я правильно понял задачу. Нужно сделать ray-cast из камеры и найти точку пересечения. Нужен физический движок для этого. Или самому написать алгоритм пересечения луча с треугольной моделью.

Но может можно по-другому задачу решить, если вы расскажете в чем задача)
Скорее всего я не понимаю общий принцип написания подобных функций. Я загружаю координаты вершин в OpenGL из которых он потом рисует этот кубик, но эта информация у меня нигде не сохраняется. В интернете сталкивался не раз с тем, что люди предлагают сначала определять вектор камеры как (х,у,z), где х и у - координаты мыши в окне (в viewport'е), а z - я так понял, глубина окна. Вопрос в том, с чем мне сравнивать этот вектор на пересечение, если я имею только MVP (ModelMatrix * ViewMatrix * ProjectionMatrix) матрицы, с помощью которых я задаю отрисовку объектам. Мне надо где-то хранить все MVP матрицы, которыми я отрисовал объекты в OpenGL? А что если этих объектов очень много, мне же придётся все эти матрицы сравнивать на пересечение с моим вектором. Да и к тому же, как моя программа узнает находятся ли в viewport'e эти объекты, глупо ведь искать пересечение с теми объектами, которые находятся вне нашего поля зрения. Если же это нормально делать более сотен или даже тысяч проверок за 1 кадр ради отслежки пересечения, то это будет очень странно. Очень затратным получается этот процесс в таком случае.
Delano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод координат tytona Помощь студентам 0 29.12.2014 20:08
Преобразование трехмерных координат точки в двухмерные координаты экрана. SaMaLerO Общие вопросы Delphi 0 18.02.2014 00:21
Преобразование одномерных координат массива в двумерные координаты матрицы nikol_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 05.05.2011 13:16
перевод координат neprogrammist Общие вопросы Delphi 2 18.05.2010 23:20
Перевод координат ax1d Общие вопросы Delphi 1 04.11.2009 14:23