Как применить перевод к координатному вектору? - PullRequest
3 голосов
/ 10 апреля 2020

Я пытаюсь реализовать и понять, как выполнить простой перевод в GLSL. Чтобы сделать это, я делаю простой тест в Octave, чтобы убедиться, что я понимаю само преобразование.

У меня есть следующий вектор, который представляет 2D-координаты, встроенные в четырехмерный вектор:

candle = [1586266800, 11812, 0, 0]

Это означает, что точка имеет местоположения x=1586266800 and y=11812.

Я пытаюсь применить перевод, используя следующие значения:

priceBottom = 11800
timestampOrigin = 1586266800

Что означает, что новый источник координат будет x=1586266800 и y=11800.

Я строю следующую матрицу перевода:

[ 1 0 0 tx ]
[ 0 1 0 ty ]
[ 0 0 1 tz ]
[ 0 0 0 1  ]

translation1 = [1, 0, 0, -timestampOrigin; 0, 1, 0, -priceBottom; 0, 0, 1, 0; 0, 0, 0, 1]

Правильна ли эта матрица? Как мне применить его к вектору?

Я пробовал:

>> candle * translation1
ans =
1.5863e+009  1.1812e+004  0.0000e+000  -2.5162e+018

Что, очевидно, не работает.

1 Ответ

2 голосов
/ 10 апреля 2020

Ваш перевод неверен. С математической точки зрения, преобразование, которое вы ищете:

image

т.е. вам нужно «увеличить» ваш вектор другим измерением со значением 1, чтобы оно может использоваться для добавления информации о «переводе» в каждую строку во время умножения матриц.

Итак, если я правильно понял ваш пример

Initial_position   = [1586266800; 11812; 0; 0]   # note: vertical vector
Augmented_vector   = [Initial_position; 1]
Translation_vector = [0         ; -12  ; 0; 0]   # note: vertical vector

Transformation = eye(5);
Transformation( 1:4, 5 ) = Translation_vector

Translated_vector = Transformation * Augmented_vector;
Translated_vector = Translated_vector( 1:4, 1 )
...