Как проверить, находится ли точка внутри четырехугольника в перспективной проекции?

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

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

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]