Позвольте мне сказать это заранее: эта проблема сложная. Есть причина, по которой на связанный вопрос Дана Стори не был дан ответ. Позвольте дать объяснение людям, которые хотят нанести удар в этом. Надеюсь, я ошибаюсь из-за того, как это тяжело.
Я предполагаю, что координаты 2D-экрана и матрица проекции / перспективы вам известны. Вы должны знать, по крайней мере, так много (если вы не знаете матрицу проекции, по сути, вы используете другую камеру, чтобы смотреть на мир). Давайте назовем каждую пару 2D экранных координат (a_i, b_i)
, и я предполагаю, что матрица проекции имеет вид
P = [ px 0 0 0 ]
[ 0 py 0 0 ]
[ 0 0 pz pw]
[ 0 0 s 0 ], s = +/-1
Почти любая разумная проекция имеет такую форму. Работая через конвейер рендеринга, вы обнаружите, что
a_i = px x_i / (s z_i)
b_i = py y_i / (s z_i)
, где (x_i, y_i, z_i)
- исходные трехмерные координаты точки.
Теперь давайте предположим, что вы знаете свою форму в наборе канонических координат (что хотите), так что вершины равны (x0_i, y0_i, z0_i)
. Мы можем расположить их как столбцы матрицы C
. Фактические координаты формы представляют собой жесткое преобразование этих координат. Давайте аналогично организуем фактические координаты в виде столбцов матрицы V
. Тогда они связаны
V = R C + v 1^T (*)
, где 1^T
- вектор строк с правильной длиной, R
- матрица ортогонального вращения жесткого преобразования, а v
- вектор смещения преобразования.
Теперь у вас есть выражение для каждого столбца сверху V
: первый столбец - { s a_1 z_1 / px, s b_1 z_1 / py, z_1 }
и т. Д.
Вы должны решить систему уравнений (*)
для системы скаляров z_i
, а жесткие преобразования определены R
и v
.
Сложности
- Уравнение нелинейно по неизвестным, с коэффициентами
R
и z_i
- До сих пор мы предполагали, что вы знаете, какие 2D-координаты соответствуют каким вершинам исходной фигуры (если ваша фигура квадратная, это немного меньше проблем).
- Мы предполагаем, что вообще есть решение; если в 2D-данных есть ошибки, то трудно сказать, насколько хорошо будет выполнено уравнение
(*)
; преобразование будет нежестким или нелинейным.