配置CGAL库并进行快速mesh相交检测

做全局光照的时候,要用到每个点发射射线然后跟mesh的相交检测,检测量非常大,效率是很大的瓶颈,考虑使用CGAL中的快速求交模型,内部会建立kdtree,从而加速求交检测的过程。

简单记录下配置CGAL库的过程:

CGAL库依赖于boost库,所以配置CGAL要首先配置boost库,如果只是使用CGAL的快速求交相应的函数的话就不需要使用期demo了,因为CGAL的demo用到QT,要是运行demo的话必须还要安装QT。

这里对boost的依赖其实只需要两个部分,一个是thread,另一个是system,所以boost只需要编译这两部分就可以了,否则编译时间比较长。
1.编译boost库
下载boost库,cmd进入相应目录,运行批处理任务boostrap.bat,这样就会生成b2.exe和bjam.exe。bjam.exe是早起的版本,最新的版本是b2.exe,所以可以忽略bjam。exe,直接运行b2.exe,
b2.exe –with-thread –with-system link=static,shared threading=single,multi variant=debug,release
这样就是只编译thread和system,并且同时生成静态和动态链接库,以及debug和release版本。
2.测试boost库
新建一个工程,并设置好include,lib以及dll路径,可以测试boost库。
配置完boost后就可以接着配置CGAL
1.下载CGAL可执行文件或者源码,执行可执行文件后会生成跟源码相同的目录结构
2.使用CMake进行编译,编译的时候要在CMake GUI上配置boost相关lib和dll的路径
3.generate得到CGAL工程,然后使用vs打开工程文件分别以debug和release模式编译,得到对应版本的库文件,这样就可以在vs中配置include,lib及dll路径,从而使用CGAL库。

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/AABB_triangle_primitive.h>

typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point;
typedef K::Triangle_3 Triangle;
typedef K::Ray_3 Ray;

typedef std::vector<Triangle>::iterator Iterator;
typedef CGAL::AABB_triangle_primitive<K, Iterator> Primitive;
typedef CGAL::AABB_traits<K, Primitive> AABB_triangle_traits;
typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;

Point p(0.0,1.0,0.0);
Point q(1.0, 0.0, 0.0);
Point r(0.0, 0.0, 1.0);
Point s(0.0, 0.0, 0.0);

Point u(-0.1, -0.1, -0.1);
Point v(1.1, 1.1, 1.1);

std::vector<Triangle> triangles;

triangles.push_back(Triangle(p, r, s));
triangles.push_back(Triangle(q, r, s));
triangles.push_back(Triangle(p, q, s));
triangles.push_back(Triangle(p, q, r));

Tree tree(triangles.begin(), triangles.end());

Ray query_ray(u, v);
cout << tree.do_intersect(query_ray) << endl;

这就是相交函数使用的简单demo,记录以备以后直接用。

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:配置CGAL库并进行快速mesh相交检测

本文链接地址:http://www.iaccepted.net/tools/3.html

相关文章



发表评论

电子邮件地址不会被公开。 必填项已用*标注