ComplexGen思路介绍
ComplexGen: CAD Reconstruction by B-Rep Chain Complex Generation (SIGGRAPH 2022)
ComplexGen是一个从点云数据重建B-Rep格式CAD表示的模型,它的重建过程分为三个步骤:
- 通过深度学习网络从输入点云中提取顶点、边、面的信息
- 通过gurobi约束求解器消除网络预测冲突
- 通过几何参数优化提高结果精度
在ComplexGen的开源代码中,第三部分几何优化只给出了visual studio的代码,意味着需要在windows上配置。但是经过笔者的探索,在windows上配置很难成功,因此笔者转化了思路,在linux上重新编译代码并运行,最终成功实现。
本文介绍如何在linux上配置ComplexGen的几何优化部分,同时也为在linux上跑visual studio项目提供了思路。
依赖库准备
安装libigl
1
2
3
4
5
6
7
git clone https://github.com/libigl/libigl.git
cd libigl
mkdir build
cd build
cmake ..
make
sudo make install
在安装过程中可能出现依赖库不存在的问题,按照igl官网的配置安装所有的依赖
1
2
3
4
5
6
7
8
9
10
11
sudo apt-get install git
sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install libx11-dev
sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-dev
sudo apt-get install libxrandr-dev
sudo apt-get install libxi-dev
sudo apt-get install libxmu-dev
sudo apt-get install libblas-dev
sudo apt-get install libxinerama-dev
sudo apt-get install libxcursor-dev
安装eigen
1
sudo apt install libeigen3-dev
GeometricRefine编译
在GeometricRefine
文件夹下进入终端
1
2
3
4
mkdir build
cd build
cmake ..
make
问题一:bigobj
在ComplexGen/GeometricRefine/GeometricRefine/CmakeList.txt
中注释掉bigobj一行
1
# add_definitions(/bigobj)
问题二:# include "per_face_normals.cpp"
1
cp *.cpp usr/local/include/igl
问题三:#include <unsupported/Eigen/SparseExtra>
需要查看eigen的安装位置,将相对地址改成绝对地址
我的eigen安装位置是 /usr/include/eigen3/unsupported/Eigen
因此将diag.cpp中的头文件引用
1
#include <unsupported/Eigen/SparseEXtra>
修改为:
1
#include </usr/include/eigen3/unsupported/Eigen/SparseEXtra>
问题四:#include "raytri.c"
解决方法,将对应文件复制到安装位置
1
cp raytri.c /usr/local/include/igl/
问题五:extern"C" FILE * __cdecl __iob_func(void)
解决:注释掉文件SurfFitter.cpp
25-27行的这个函数
1
2
3
4
extern"C" FILE * __cdecl __iob_func(void)
{
return _iob;
};
通过grep -rn "__cdecl __iob_func"
命令的输出可以看到,这个函数只在这里定义了一次
通过查询可知,该函数与Visual Studio的环境有关,我们这里无需这一项,因此直接注释
问题六:std::sqrt(deltaDiv108)
以及std::atan2(betaIm, betaRe)
这个bug是因为数字类型转换的问题,在文件RootsPolynomial.h中的406-407行中,可以看到如下代码:
1
2
Rational betaIm = std::sqrt(deltaDiv108);
Rational theta = std::atan2(betaIm, betaRe);
通过强制类型转换,替换为以下代码即可
1
2
Rational betaIm = std::sqrt((double)(deltaDiv108));
Rational theta = std::atan2((double)(betaIm), (double)(betaRe));
问题七:inputfile.substr(0, inputfile.find_last_of("."))
字符串处理问题,不是核心代码,直接将其修改为string
类型
初始469-470行代码为:
1
2
auto& inputfile = result["i"].as<std::string>();
auto& inputprefix = inputfile.substr(0, inputfile.find_last_of("."));
将其修改为:
1
2
std::string inputfile = result["i"].as<std::string>();
std::string inputprefix = inputfile.substr(0, inputfile.find_last_of("."));
问题八:编译参数报错
问题出在cannot find的4个参数
使用grep -rn "-llegacy_stdio_definitions"
查看参数所在位置,可以看到位于同级目录下的link.make
文件中:
该文件中的内容如下:
1
/usr/bin/c++ -rdynamic CMakeFiles/GeometricRefine.dir/src/CurveFitter.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HLBFGS.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HLBFGS_BLAS.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HLBFGS_Constraint.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HLBFGS_Hessian.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HLBFGS_Sparse_Matrix.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HOptimizer.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/HOptimizer_Internal.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/ICFS.cpp.o CMakeFiles/GeometricRefine.dir/src/HOptimizer/LineSearch.cpp.o CMakeFiles/GeometricRefine.dir/src/Helper.cpp.o CMakeFiles/GeometricRefine.dir/src/Mesh3D.cpp.o CMakeFiles/GeometricRefine.dir/src/NURBSFittingWrapper.cpp.o CMakeFiles/GeometricRefine.dir/src/SurfFitter.cpp.o CMakeFiles/GeometricRefine.dir/src/main.cpp.o -o ../../Bin/GeometricRefine -L/root/autodl-tmp/ComplexGen/GeometricRefine/GeometricRefine/src -L/root/autodl-tmp/ComplexGen/GeometricRefine/Lib -L/root/autodl-tmp/ComplexGen/GeometricRefine/allquadricsdirect/lib/CLAPACK/lib_64 -Wl,-rpath,/root/autodl-tmp/ComplexGen/GeometricRefine/GeometricRefine/src:/root/autodl-tmp/ComplexGen/GeometricRefine/Lib:/root/autodl-tmp/ComplexGen/GeometricRefine/allquadricsdirect/lib/CLAPACK/lib_64 ../allquadricsdirect/liballquadricsdirect.a ../yaml-cpp/libyaml-cpp.a -llegacy_stdio_definitions -llibf2c -lclapack -lBLAS
可以看到后面的四个链接参数,这些参数是windows下使用的,对应的替换为linux下的参数,也即将
1
-llegacy_stdio_definitions -llibf2c -lclapack -lBLAS
修改为:
1
-pthread -llapack -lblas
此处应当注意,如果未安装对应库应当安装对应的库,否则会出现cannot find -llapack
类似报错:
1
2
sudo apt-get install liblapack-dev
sudo apt-get install libblas-dev
至此,在Bin
文件夹中编译完成可执行文件GeometricRefine
。
参考文献
- ComplexGen开源代码: https://github.com/guohaoxiang/ComplexGen
- ComplexGen原文:https://haopan.github.io/papers/ComplexGen.pdf