Преобразование системы координат в 3D - PullRequest
0 голосов
/ 19 октября 2018

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

Теперь у меня есть случай использования, когда мне нужно преобразовать это облако точек в систему координат камеры, где каждая 3D-точкаполучит новую координату XYZ.Точно так же восемь угловых точек трехмерного ограничивающего прямоугольника должны быть преобразованы в систему координат камеры.

Теперь у меня есть внешняя матрица;(матрица вращения и перемещение), которая преобразует векторы столбцов из системы координат камеры в мировую систему координат.Я преобразовываю матрицу вращения в кватернион для простоты.

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

void get_inverse_transform( const Eigen::Quaternionf& orientation,
                            const Eigen::Vector3f& translation,
                            Eigen::Quaternionf& inverse_orientation,
                            Eigen::Vector3f& inverse_traslation)
{

    inverse_orientation = orientation.normalize().inverse().normalise();
    inverse_translation = -1*inverse_orientation._transformVector(position);
}

Теперь inverse_translation и inverse_orientation содержат преобразование, которое преобразует точки в мировой системе координат всистема координат камеры.

Итак, я преобразую восемь углов ограничительной рамки, используя это преобразование, в координаты камеры следующим образом:

void project2CS( const Eigen::Quaternionf& inverse_orientation,
                 const Eigen::Vector3f& inverse_position,
                 std::vector<Eigen::Vector3f>& bbox3d_corners)
{

    for( auto& corner: bbox3d_corners )
    {
        auto transformed_vec = inverse_orientation._transformVector(corner) + inverse_translation;
        corner[0] = transformed_vec[0];
        corner[1] = transformed_vec[1];
        corner[2] = transformed_vec[2];
    }
}

Я также преобразую облако точек в камерусистему координат и визуализируйте ее с помощью ограничительной рамки, ограничивающая рамка больше не окружает объект.Более того, я вижу, что размер ограничительной рамки немного меняется.

Я подозреваю, что делаю что-то не так в получении обратного преобразования.Любые идеи о том, как получить эту работу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...