Проблема проецирования сетки на изображение

У меня есть треугольная сетка, которую я читаю из файла 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. У меня есть несколько общих вопросов.

  1. Я делаю что-то неправильно; мой подход на правильном пути?
  2. Пропускает ли дерево AABB определенные грани при проверке пересечений лучей в зависимости от ориентации?
  3. Я понимаю, как строятся деревья AABB, но как эффективно рассчитать пересечения лучей с использованием деревьев AABB?
  4. Есть ли более эффективный способ сделать такие вещи?

Спасибо.

0 ответов

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