2013-07-25 2 views
0

Я хочу проверить, находится ли какая-либо точка в мире на квадранте/плоскости? Квад/плоскость может быть переведена/повернута/масштабирована любыми значениями, но она все же должна быть способна определить, находится ли на ней данная точка. Мне также нужно получить место, где должна была быть точка, если бы квадрант не применял никакого вращения/масштабирования/перевода.Как проверить, находится ли точка внутри квадрата в перспективной проекции?

Например, рассмотрите квадрант 0, 0, 0 с размером 100x100, повернутый под углом 45 градусов вдоль оси z. Если мое местоположение мыши в мире находится в (x, y, 0,), мне нужно знать, попадает ли эта точка на этот квадрат в его текущем преобразовании? Если да, то мне нужно знать, не были ли применены преобразования в квад, где этот пункт был бы на нем? Любой образец кода будет иметь большую помощь

+2

Я думаю, что это проблема XY. Я имею в виду, что вы можете * инвертировать * -трансформировать свою точку зрения, а затем использовать регулярные плоские вычисления, но если вы реализуете что-то вроде выбора (похоже, это так), укажите это, и ответы смогут настроить для этого. Сейчас это немного шире. –

+0

«рассмотрите квадрат на 0, 0, 0 с размером 100x100». Это недоказано. Вы действительно имеете в виду четырехугольник, или вы имели в виду прямоугольник (который полностью указан как ширина x высота)? Это имеет большое значение для ответа. – MSalters

+0

@MSalters делает это? Вычисления для произвольных квадритераторов требуют только тезселяции, которые необходимо выполнить для рендеринга в любом случае. –

ответ

1

луч литья подход, вероятно, самый простой:

  1. Используйте gluUnProject(), чтобы получить направление мирового пространства луча, чтобы бросить на сцену. Происхождение луча - это положение камеры.
  2. Поместите этот луч в пространство объектов, преобразуя его в обратное преобразование прямоугольника. Обратите внимание, что вам необходимо преобразовать как точку начала координат, так и вектор направления.
  3. Вычислить точку пересечения между этим лучом и плоскостью XY с помощью стандартного теста пересечения лучей.
  4. Убедитесь, что значения x и y точки пересечения находятся в пределах вашего прямоугольника, если они тогда, это ваш желаемый результат.

математики библиотека, такие как GLM будет очень полезно, если вы не уверены, о некоторых из математики, участвующей здесь, он имеет соответствующие функции, такие как glm::unProject(), а также функция, чтобы инвертировать матрицы и сделать все другие преобразования вам нужно.

Смежные вопросы