从AABB树交叉点获取基元

时间:2018-07-03 07:27:39

标签: intersection cgal raytracing aabb

此代码包含使用多面体_3网格构建的AABB树。可以验证是否发生交叉路口,但不能验证交叉路口撞到的原始图元。我如何检索原语?

typedef CGAL::Polyhedron_3<Kernel>         Polyhedron;
const Polyhedron& mesh;
tree(faces(_mesh).first, faces(_mesh).second, _mesh);

boost::optional<Primitive_id> intersection = tree.first_intersected_primitive(ray);

if(intersection)
{
//how to get the primitive?
}

编辑:

faces(mesh, tree);
faces(*mesh, tree);

faces(hit, tree);
faces(*hit, tree);

也不行。

Edit2:

                CGAL::internal::In_place_list_iterator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > >, std::allocator<CGAL::HalfedgeDS_in_place_list_face<CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > > > > > it = *hit;

                CGAL::I_Polyhedron_facet<CGAL::HalfedgeDS_face_base<CGAL::HalfedgeDS_list_types<CGAL::Simple_cartesian<double>, CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>, std::allocator<int> >, CGAL::Boolean_tag<true>, CGAL::Plane_3<CGAL::Simple_cartesian<double> > > >::Halfedge_around_facet_circulator ipfacet = it->facet_begin();

为您提供迭代器和I_Polyhedron_facet。

2 个答案:

答案 0 :(得分:1)

Cgal确实缺少一些文档。

这里是解决方案:获取围绕顶点顶点的迭代器,primitive_id-> facet_begin(); 。然后执行此操作。

            Ray_intersection hit = tree.first_intersection(rays[this->transformCoordinates(y,x)]);
            if(hit)
            {
                const Point& point =  boost::get<Point>(hit->first);
                const Primitive_id& primitive_id = boost::get<Primitive_id>(hit->second);

                Polyhedron::Halfedge_around_facet_circulator facerunner = primitive_id->facet_begin();

                Point p1;
                Point p2;
                Point p3;

                p1 = facerunner->vertex()->point();
                facerunner++;
                p2 = facerunner->vertex()->point();
                facerunner++;
                p3 = facerunner->vertex()->point();

                Vector v1(p1,p2);
                Vector v2(p1,p3);

                Vector n = CGAL::cross_product(v1,v2);
                n = n/ std::sqrt(n.squared_length());
    }

来自cgal邮件列表的答案:

您正在寻找的东西在这里找不到:

https://doc.cgal.org/latest/AABB_tree/index.html#title6

还要注意从这里: https://doc.cgal.org/latest/AABB_tree/classCGAL_1_1AABB__face__graph__triangle__primitive.html

您有: typedef boost :: graph_traits :: face_descriptor ID

在同一页面上,您看到图形类型是FaceGraph的模型:

https://doc.cgal.org/latest/BGL/classFaceGraph.html

根据所选图形的类型,您可以访问精确的 face_descriptor对应的文档:

https://doc.cgal.org/latest/BGL/group__PkgBGLTraits.html

然后,您可以参考该类的文档以了解如何 遍历脸部顶点。

甚至还有一个通用的辅助函数可以做到:

for ( boost::graph_traits<Graph>::vertex_descriptor v :
      CGAL::vertices_around_face(halfedge(f, g), g))
{
  Point_3 p = get(boost::vertex_index, v, g);
}

我并不是说很容易获得,但是阅读文档可以使您 所需资料。这不像在您的位置阅读vtk文档 猜测或阅读源代码以了解事物。

无论如何,我们一直在寻求改进文档的方式,我们会尽快 有一些交叉包教程,以及有关如何操作 一定会在CGAL中添加曲面网格。

答案 1 :(得分:0)

如果交集不为null,则* intersection应该是您要查找的图元的Primitive_id。