Нахождение объекта под мышкой - PullRequest
2 голосов
/ 04 сентября 2010

Я занимаюсь разработкой игры, в которой весь ландшафт состоит из блоков AABB.Я знаю вершины, минимум и максимум каждой коробки.Я также настроил свою камеру следующим образом:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(Camera.rotx,1,0,0);
glRotatef(Camera.roty,0,1,0);
glRotatef(Camera.rotz,0,0,1);

glTranslatef(-Camera.x,-Camera.y,-Camera.z);

Я пытаюсь найти куб, на котором находится мышь.Я думал о том, чтобы задать положение мыши в виде вектора направления вперед и просто перебирать, пока «пуля мыши» не достигнет чего-либо.Однако это включает в себя взаимодействие через все объекты несколько раз.Есть ли способ, которым я мог бы сделать это, перебирая все объекты один раз?

Спасибо

Ответы [ 5 ]

3 голосов
/ 04 сентября 2010

Обычно это называется «сбор» Здесь выглядит как хорошая ссылка на основе gl

Если это tldr, то базовый алгоритм, который вы можете использовать

  1. сортировка объектов по z (или сохранение их по z, или уловки буфера глубины и т. Д.)
  2. итерация и проверка границ, остановка при нажатии на первую.
1 голос
/ 04 сентября 2010

Это называется Ray Tracing (упс, моя ошибка, на самом деле это Ray Casting ). Каждый физический движок обладает этой функциональностью. Вы можете взглянуть на одну из самых простых - ODE или ее производную - Bullet. Они с открытым исходным кодом, поэтому вы можете взять то, что вам не нужно. У них обоих есть удобная математическая библиотека, которая обрабатывает все часто используемые операции с матрицами и вершинами. У всех есть демонстрации того, как именно выполнить эту задачу.

0 голосов
/ 04 сентября 2010

Вы хотите использовать алгоритм 3D выбора.Идея заключается в том, что вы рисуете луч с позиции пользователя в виртуальном мире по направлению клика. В этом блоге очень четко объясняется, как реализовать такой алгоритм.По сути, ваши экранные координаты должны быть преобразованы из пространства экрана в пространство виртуального мира.Есть веб-сайт с очень хорошим описанием различных преобразований, и я не могу опубликовать ссылку из-за своего ранга.Поиск книги по алгоритму выбора мышью крючка [я не являюсь владельцем сайта, и я не являюсь автором документа].

Как только вы получите луч в нужном направлении, вам необходимо выполнить тесты для пересечения сгеометрии в реальном мире.Поскольку у вас полностью есть блоки AABB, вы можете использовать простые векторные уравнения, чтобы проверить, какая геометрия пересекает луч.Я бы сказал, что аппроксимация ваших коробок как сферы сделает жизнь очень легкой, поскольку существует очень простой тест пересечения сферических лучей.Итак, ваш луч будет описан тем, что вы получите на первом шаге (луч нарисован на первом шаге), а затем вам нужно будет использовать тест пересечения.Если вы согласны с использованием сфер, центром сферы будет точка, в которой вы рисуете свой прямоугольник, а диаметром будет ширина вашего прямоугольника.

Удачи!

0 голосов
/ 04 сентября 2010

Я предлагаю вам рассмотреть этот вопрос с более широкой перспективы.

Коробки - это просто точки с более низким разрешением.Хитрость заключается в том, чтобы уменьшить разрешение мыши, чтобы выяснить, в каком окне она находится.

Возможно, вам придется выполнить преобразование 2d в 3d (или наоборот).В большинстве игр мышь живет в двухмерном координатном мире.Материал под мышкой - это 2-я проекция трехмерной вселенной.

0 голосов
/ 04 сентября 2010

Существует много информации о тестировании хитов в OpenGL в FAQ по OpenGL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...