Я думаю, что эта проблема создаст множество возможных решений, по крайней мере, в 2D, это делает. Для 2D случая:
|
-----------+-----------
/|\
/ | \
/ | \
/---+---\VP
/ | \
/ | \
/ | \
/ | \
/ | -- \
/ | | \
/ | | \
На приведенной выше диаграмме вертикальный сегмент и горизонтальный сегмент будут проецироваться на одну и ту же линию на плоскости обзора (VP). Если вы вычеркните это в масштабе, вы увидите, что есть два луча от глаза, проходящие через каждую конечную точку непроецированной линии. Эта линия может быть во многих положениях и поворотах - представьте, что вы бросаете палку в конус, она может застрять в любом количестве позиций.
Итак, в двумерном пространстве существует бесконечное количество решений в четко определенном наборе.
Применимо ли это к 3D?
Алгоритм будет выглядеть следующим образом:
- Инвертировать матрицу проекции
- Рассчитайте четыре луча, которые проходят через вершины прямоугольника, эффективно создавая перекошенную пирамиду
- Попробуйте и поместите свой прямоугольник в пирамиду. Это сложный момент, и я пытаюсь мысленно визуализировать прямоугольники в пирамидах, чтобы увидеть, могут ли они соответствовать более чем одним способом.
РЕДАКТИРОВАТЬ: Если бы вы знали расстояние до объекта, это стало бы тривиальным.
РЕДАКТИРОВАТЬ V2:
Хорошо, пусть Rn - четыре луча в мировом пространстве, то есть преобразованные через обратную матрицу, выраженную через m.Rn, где | Rn | это один. Следовательно, четыре точки прямоугольника:
P1 = aR1
P2 = bR2
P3 = cR3
P4 = dR4
где P1..P4 - точки по окружности прямоугольника. Отсюда, используя немного векторной математики, мы можем вывести четыре уравнения:
|aR1 - bR2| = d1
|cR3 - dR4| = d1
|aR1 - cR3| = d2
|bR2 - dR4| = d2
, где d1 и d2 - длины сторон прямоугольника, а a, b, c и d - неизвестные.
Теперь, возможно, не существует решения для вышеизложенного, в этом случае вам нужно поменять местами d1 с d2. Вы можете расширить каждую строку до:
(a.R1x - b.R2x) 2 + (a.R1y - b.R2y) 2 + (a.R1z - b.R2z) 2 = d1 2
где R1? а R2? являются компонентами x / y / z лучей 1 и 2. Обратите внимание, что вы решаете для a и b выше, а не x, y, z.