Расчет перспективы преобразования матрицы - PullRequest
2 голосов
/ 11 марта 2011

Учитывая точку в трехмерном пространстве, как я могу вычислить матрицу в однородных координатах, которая будет проецировать эту точку в плоскость z == d, где начало координат - центр проекции.

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

ОК, давайте попробуем разобраться с этим, расширив ответ Эммануила.

Предполагая , что ваш вектор обзора находится непосредственно вдоль оси Z, все размеры должны быть масштабированы с отношениемрасстояние от плоскости обзора d до исходной z координаты.Это соотношение тривиально d / z, что дает:

x' = x * (d / z)
y' = y * (d / z)
z' = z * (d / z)    ( = d)

В однородных координатах обычно начинают с P = [x, y, z, w], где w == 1, и преобразование выполняется следующим образом:

P' = M * P

Результат будет иметь w != 1, и для получения реальных трехмерных координат мы нормализуем однородный вектор, разделив все это на его w компоненту.

Итак, все, что нам нужно, это матрица, котораяданное [x, y, z, 1] дает нам [x * d, y * d, z * d, z], то есть

| x' |  =    | d   0   0   0 |  *  | x |
| y' |  =    | 0   d   0   0 |  *  | y |
| z' |  =    | 0   0   d   0 |  *  | z |
| w' |  =    | 0   0   1   0 |  *  | 1 |

, которое после нормализации (путем деления на w' == z) дает вам:

[ x * d / z, y * d / z,   d,   1 ]

на первый набор уравненийвыше

1 голос
/ 17 декабря 2013

Матрица однородного преобразования (Эйлер, качка-рыскание):

|r1 r2 r3 dx|
|r4 r5 r6 dy|
|r7 r8 r9 dz|
|px py pz sf|

r1-9 - элементы комбинированной матрицы вращения: Rx * Ry * Rz (отработать) dx dyи dz - элементы вектора смещения (d) px py и pz - элементы вектора перспективы (p); sf - это коэффициент масштабирования

, начиная с этого момента, если вы используете обратную величину, вы получите свою проекцию какперспективу в любой произвольной плоскости, передавая вращения вашей целевой плоскости, а также ее исходное положение относительно исходного положения (сохраняя вектор перспективы в 0 0 0 и sf = 1 для чистой кинематики), вы получаете T-> T * =T1.Получить T1 ^ -1 (для кинематики это просто R '(транспонировано,), горизонтальное сцепление -R' * d, затем вертикальное сцепление просто 0 0 0 1).

может иметь несколько плоскостей, напримерa, b, c как цепочка, в этом случае T1 = Ta * Tb * Tc * ...

затем v (новый) = (T1 ^ -1) * v (старый), работа выполнена.

1 голос
/ 11 марта 2011

Я предполагаю, что проекция, которую вы имеете в виду, как говорит Бета, состоит в пересечении между:

  • линией, образованной началом координат O(0, 0, 0) и точкой P(a, b, c), которую нужно преобразовать
  • и плоскость z=d

Если я прав, то давайте посмотрим на уравнение этой линии, заданное векторным произведением OP ^ OM = 0 (напомним, что уравнениелинии между двумя заданными точками A и B задается как AB ^ AM = 0, с M(x, y, z), это векторное произведение, поэтому все являются векторами: 0 представляет нулевой вектор, AB являетсявектор AB и т. д.):

bz - cy = 0
cx - az = 0
cz - bx = 0

При z = d мы имеем только 2 линейно независимых уравнения:

bd = cy
cx = ad

Таким образом, эта проекция преобразует точку P(a, b, c) вточка P'(ad/c, bd/c, d).Для однородных координат, которые дают:

P'(ad/c, bd/c, d) = P'(ad/c, bd/c, cd/c)
                  = P'(ad/c: bd/c: cd/c: 1)
                  = P'(a: b: c: d/c)

EDIT: первая найденная матрица была:

    1, 0, 0, 0
    0, 1, 0, 0
A = 0, 0, 1, 0
    0, 0, 0, d/c

, но она использует c, которая является координатой точки P!!Это чепуха, я не смог найти выражение A, которое не использует эти координаты.Возможно, я недостаточно знаком с однородными координатами.

...