Проблема проецирования сетки на изображение
У меня есть треугольная сетка, которую я читаю из файла ply и строю дерево AABB, используя его.
Eigen::MatrixXd V;
Eigen::MatrixXi F;
if(!igl::readPLY(mesh_file, V, F)){
std::cerr<< "Error occurred in reading the ply file\n";
exit(1);
}
std::cout << "Total number of vertices are " << V.rows() << "\n";
std::cout << "Total number of Faces are " << F.rows() << "\n";
std::cout << "Building the AABB tree\n";
igl::AABB<Eigen::MatrixXd, 3> tree;
tree.init(V,F);
Я хочу проецировать это на плоскость изображения. У меня есть внешние и внутренние функции камеры, поэтому для каждого пикселя изображения я генерирую луч, используя координаты камеры и координаты пикселей в мировой системе координат. Я пытаюсь найти первое пересечение луча.
const Eigen::Vector3d source(cam_center_wcs[0], cam_center_wcs[1], cam_center_wcs[2]);
const Eigen::Vector3d dir_vec(dir_vector[0], dir_vector[1], dir_vector[2]);
igl::Hit hit; // intersection result
bool did_intersect = MatTreeMain.intersect_ray(V, F, source, dir_vec, hit);
if( ! did_intersect ) {
non_intersection_counter++;
} else {
//calculate the depth map using distance hit.t
}
Я знаю, что центр камеры определенно находится внутри сетки, и каждый генерируемый луч должен пересекаться с сеткой, но по какой-то причине для изображения с разрешением 1000 x 1000 почти 75% лучей не пересекаются с сеткой.
Хотя я использую код libigl, я попробовал его и с использованием CGAL. У меня есть несколько общих вопросов.
- Я делаю что-то неправильно; мой подход на правильном пути?
- Пропускает ли дерево AABB определенные грани при проверке пересечений лучей в зависимости от ориентации?
- Я понимаю, как строятся деревья AABB, но как эффективно рассчитать пересечения лучей с использованием деревьев AABB?
- Есть ли более эффективный способ сделать такие вещи?
Спасибо.