Обратная 3D (треугольная) проекция

Если Вы находитесь на версии Windows, которая поддерживает.Net 2.0, я заменил бы Вашу оболочку. PowerShell дает Вам полную мощность .NET из командной строки. Существует много commandlets, встроенные также. Пример ниже решит Ваш вопрос. Я использую полные имена команд, существуют более короткие псевдонимы, но это дает Вам что-то Google для.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

5
задан Mr.Wizard 29 March 2011 в 18:09
поделиться

4 ответа

Существует функция Projection, которая может преобразовывать точки так, чтобы Projection ([x1, y1]) = [px1, py1], Projection ([x2, y2]) = [px2, py2 ], Проекция ([x3, y3]) = [px3, py3]. Если я правильно понимаю, автор хочет знать, как найти эту функцию проекции, чтобы он мог преобразовать [x4, y4] в [px4, py4].

Поскольку здесь мы имеем дело с плоскостями, функция Projection выглядит так :

Proj([ix, iy]) :
    return [ax*ix + bx*iy + cx,
            ay*iy + by*iy + cy];

Используя это, мы можем составить 2 системы уравнений для решения.

Первая
x1 * ax + y1 * bx + cx = px1
x2 * ax + y2 * bx + cx = px2
x3 * ax + y3 * bx + cx = px3

Решение для ax , bx и cx дает нам

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

Второй x1 * ay + y1 * by + cy = py1
x2 * ay + y2 * по + cy = py2
x3 * ay + y3 * с помощью + cy = py3

Решение для ay , с помощью и cy дает нам

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

Примечание: я использовал этот инструмент для решения систем уравнений.

2
ответ дан 15 December 2019 в 01:09
поделиться

Следует использовать гомографические функции и однородные координаты , которые обычно используются для операций с трехмерной перспективой.

1
ответ дан 15 December 2019 в 01:09
поделиться

Напишите

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1),

решение для A1, A2, A3. Тогда

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3).

1-я редакция.

(A1, A2, A3) является решением линейной системы Mat * (A1, A2, A3) = (x4, y4,1).

      ( x1  x2  x3 )
Mat = ( y1  y2  y3 )
      (  1   1   1 )

Это можно решить в различные способы. Например, используя правила Крамера .

2-е редактирование.

Вставленные единицы являются не координатами Z, а однородными расширениями входных координат (которые должны быть евклидовыми координатами). (A1, A2, A3) - однородные координаты в базисе, образованном вершинами треугольника.

3-е редактирование.

Соответствие между трехмерной плоскостью и плоскостью проекции является проективным преобразованием. Его можно определить как матрицу T 3x3, работающую с однородными координатами во входной плоскости (x, y, 1) (в вашей системе координат) и производящую координаты (u, v, t) в плоскости проекции. Тогда px = u / t и py = v / t.

1
ответ дан 15 December 2019 в 01:09
поделиться

Я действительно не понимаю, в чем проблема? Вы пытаетесь найти объект в 3D-пространстве, который, как вы знаете, расположен на плоскости (например, стена или пол), и единственный вход, который у вас есть, - это 3 точки (из которых вы знаете расстояния между ними в 3D-пространстве) от изображение камеры?

В этом случае у вас будет 3 таких уравнения, где localCoordinates - это координаты точек в пространстве объектов (дает известное расстояние между точками), а world - это положение объектов в трехмерном пространстве.

cameraCoordinates = world*view*projection*localCoordinates

Это даст систему уравнений с 6 неизвестными (вращение и положение в 3d) и 6 уравнениями (по 2 для каждой точки). Однако он будет нелинейным, поэтому вам придется решать его численными методами. Попробуйте метод Ньютона-Рэпсона.

0
ответ дан 15 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: