Как повернуть облако точек вокруг оси?

У меня есть облако точек изображения глубины, которое было снято камерой на 30 градусов выше горизонтали (повернутой на 30 градусов по оси Z). Я хочу перевести все точки обратно в их положение, как если бы камера находилась под углом 0 градусов, что, как мне кажется, я могу сделать со следующей матрицей вращения:

|cos(30) -sin(30) 0| 
|sin(30)  cos30   0| 
|0        0       1|

Однако, глядя на метод pcl для преобразования облака точек, я обнаружил следующее:

pcl::transformPointCloud (const PointCloud< PointT > &cloud_in, 
PointCloud< PointT > &cloud_out, const Eigen::Matrix< Scalar, 4, 4 > &transform)

Но почему это матрица 4x4, а не вращение 3x3 выше?


person Aly    schedule 14.12.2012    source источник
comment
вам нужна матрица 4 x 4 для выполнения переводов.   -  person andre    schedule 14.12.2012


Ответы (2)


|x||1 0 0 a| =  |x+a|
|y||0 1 0 b|    |y+b|
|z||0 0 1 c|    |z+c|
|1||0 0 0 1|    |1  |

В этом примере мы переместили точку (x,y,z) в точку (x+a, y+b, z+c). Это можно сделать только с матрицей 4 х 4.


|cos(30) -sin(30) 0 0| multiply The Matrix above. 
|sin(30)  cos30   0 0| 
|0        0       1 0|
|0        0       0 1|

Это даст вам вращение и перемещение точки.

person andre    schedule 14.12.2012
comment
и как бы я выполнил вращение вокруг оси? - person Aly; 14.12.2012
comment
@Aly используйте матричное умножение, если вы хотите повернуть и перевести точку. Если вы хотите просто повернуть, просто используйте матрицу вращения отдельно с дополнительными элементами, чтобы сделать ее 4x4. - person andre; 14.12.2012

Матрица 4x4 представляет собой матрицу преобразования в следующем виде

| R    | t | 
|--------- |
|0 0 0 | 1 |

где R — ваша матрица вращения 3x3, а t — вектор переноса 3x1. В вашем случае t = [0,0,0]'

Для получения дополнительной информации: http://en.wikipedia.org/wiki/Transformation_matrix

person MeDo    schedule 14.12.2012