3D-координаты камеры с мировыми координатами (смена базы?)

Предположим, у меня есть координаты X, Y, Z и ориентация Rx, Ry, Rz объекта относительно камеры. Кроме того, у меня есть координаты U, V, W и ориентация Ru, Rv, Rw этой камеры в мире.

Как мне преобразовать положение (местоположение и вращение) объекта в его положение в мире?

Для меня это звучит как смена основы, но я пока не нашел ясного источника.

2 ответа

Я нашел этот документ, который достаточно ясно по теме. http://www.cse.psu.edu/~rcollins/CSE486/lecture12.pdf

Он относится, в частности, к обратной операции, то есть к переходу от мира к трехмерным координатам камеры.

Pc = R (Pw - C) Где Pc - точка в мире камер, Pw - точка в нормальном мире, R - матрица вращения, а C - трансляция камеры.

К сожалению, довольно сложно добавлять латексные формулы, поэтому вместо этого я приведу немного кода Matlab.

function lecture12_collins()
% for plotting simplicity I choose my points on plane z=0 in this example
% Point in the world
Pw = [2 2.5 0 1]';
% rotation
th = pi/3;
% translation
c = [1 2.5 0]';
% obtain world to camera coordinate matrix
T = GetT(th, c);
% calculate the camera coordinate
Pc = T*Pw
% get the camera to world coordinate
T_ = GetT_(th, c)
% Alternatively you could use the inverse matrix
% T_ = inv(R*C)

% calculate the worldcoordinate
Pw_ = T_*Pc

assert (all(eq(Pw_ ,Pw)))


function T = GetT(th, c)
% I have assumed rotation around the z axis only here.
R = [cos(th) -sin(th) 0 0
     sin(th)  cos(th) 0 0
          0        0  1 0
          0        0  0 1];
C = [1  0   0   -c(1)
     0  1   0   -c(2)
     0  0   1   -c(3)
     0  0   0   1];
 T = R*C;

function T_ = GetT_(th, c)
% negate the angle
R_ = [cos(-th) -sin(-th) 0 0
     sin(-th)  cos(-th) 0 0
          0        0  1 0
          0        0  0 1];
% negate the translation
C_ = [1  0   0   c(1)
     0  1   0   c(2)
     0  0   1   c(3)
     0  0   0   1];
T_ = C_*R_

Пока это касается только местоположения. Вращение, которое я решил, используя дополнительные знания о вращении. Я знаю, что моя камера перпендикулярна объекту и что ее вращение происходит только вокруг оси z. Я могу просто добавить вращение камеры и объекта.

На самом деле у вас есть две основы: одна относительно камеры, другая - абсолютная (мир). Таким образом, вы в основном хотите преобразовать ваши относительные данные в абсолютные данные.

Место нахождения

Это самый простой. Вы должны перевести положение (X,Y,Z) на вектор t(U,V,W). Таким образом, все ваши абсолютные позиции (Ax, Ay, Az) = (X,Y,Z)+t = (X+U,Y+V,Z+W).

ориентация

Это немного сложнее. Вы должны найти матрицу вращения, которая поворачивает вашу камеру от (я предполагаю) (0,0,1) до (Ru,Rv,Rw). Вы должны взглянуть на Матрицы базового вращения, чтобы разложить 2 вращения, которые принимают (0,0,1) - (Ru,Rv,Rw) (одно по оси X, одно по оси Z, например). Я советую вам нарисовать абсолютный базис и вектор (Ru, Rv, Rw) на листе бумаги, это самый простой способ получить правильный результат.

Таким образом, у вас есть 2 базовых матрицы поворотов r1 и r2. Результирующая матрица вращения r = r1*r2 (или r2*r1, это не имеет значения). Таким образом, абсолютная ориентация вашего объекта (ARx, ARy, ARz) = r*(Rx,Ry,Rz).

Надеюсь это поможет!

Другие вопросы по тегам