| 
				
					 | 
			10 months ago | |
|---|---|---|
| .. | ||
| App | 10 months ago | |
| ThirdParty | 10 months ago | |
| test | 10 months ago | |
| CMakeLists.txt | 10 months ago | |
| LICENSE | 10 months ago | |
| README.md | 10 months ago | |
| build.sh | 10 months ago | |
| teaser.png | 10 months ago | |
		
			
				
				README.md
			
		
		
	
	Feature-preserving Isosurface Extraction
 
This code is accompanied with the following work for extracting the iso surface of a given implicit surface:
Hao-Xiang Guo, Yang Liu, Hao Pan, Baining Guo. Implicit Conversion of Manifold B-Rep Solids by Neural Halfspace Representation, ACM Transactions on Graphics(SIGGRAPH ASIA), 2022.
Installation Guide (64-bits system)
The code was tested under both Linux (Ubuntu 18.04, 20.04) and Windows (Windows 10+), with and without GPU support (Cuda 10+). The following guide is for Linux system with Cuda GPU support.
- 
Step 1: download essential packages LibTorch 1.7.1+cu101 and [CuDNN 8.0.5+cu101](https://developer.nvidia.com/rdp/cudnn-archive). Extract the above packages into two folders
libtorchandcudnnunder the folderIsoSurfacing.Higher versions of LibTorch, CuDNN and CUDA can be used here, but you may need to install additional packages like
intel-mkl, and specify CMake path. - 
Step 2: Compile the code. You need
cmake(ver >= 3.9) andg++(>= 8.0). 
    cd IsoSurfacing && mkdir build && ./build.sh
Usage: Isosurface extraction from neural implicits
Run the following command to see the guidance.
    cd .IsoSurfacing/build/App/console-pytorch
    ./ISG_console_pytorch -h
The following message is printed on screen.
    --- Usage:
    ISG_pytorch [OPTION...]
    -i, --input arg      input model(*.pt)
    -d, --depth arg      octree depth (2-10)(default: 7)
    -b, --box arg        bounding box size (default: 2)
    -a, --angle arg      feature angle threshold for EMC  (default: 30 degree)
    -m, --method arg     Method: EMC, DC, MC (default: EMC)
    -o, --output arg     output mesh (ply format)
    -t, --threshold arg  threshold value for computing intersection. (default:
                        1e-7)
    -n, --maxiter arg    max iteration number for computing intersection.
                        (default: 50)
    -g, --gpu            use GPU model (default: true)
    -s, --setbuf arg     set buffer size (default: 131072)
    -x, --type arg       set model type (2dim or 3dim) (default: 2)
    -l, --alldepth       generate meshes for each depth layer (default, false)
    -v, --isovalue arg   isovalue (default: 0)
    -k, --vtkoput        output vtk format
    -c, --useoctree      use octree speedup (default, false)
    -y, --verbose        print progress (default, true)
    -h, --help           Print help
        --compare arg    GT mesh for SDF comparison (*.ply)
        --compres arg    resolution for for SDF comparison (default: 32)
Assume that you have a network model in pytorch (*.pt) format that takes a set of 3D coordinates as input and outputs the corresponding implicit values or signed distances,  you can use ISG_console_pytorch to extract the isosurface of the implicit function, with sharp feature preserving property (see our paper).
./ISG_console_pytorch -i ./test/teaser.pt -o outputmesh.ply -v -0.01 -d 8
Here -0.01 is the specified isovalue, -d 8 is the max depth of grid volume, you may need to set it to a high value if the isosurface contains very narrow regions that needs high-resolution grids. You can set --useoctree=true to speed up the computation, but it may fail to recover small regions in some circumstances occasionally. If you want to recover very flat feature curves, you can use -a and specify a small angle like 5 degree, if EMC method is employed.  You can set a large buffer size via -s integervalue if you own a GPU with much large memory. The default value 131072 is tested on a GPU with 11GB Mem.
Here EMC is the algorithm proposed by Kobbelt et al. --- Feature Sensitive Surface Extraction from Volume Data, SIGGRAPH 2001, DC corresponds to the Dual Contour algorithm proposed by Ju et al. --- Dual Contouring of Hermite Data, SIGGRAPH 2022.  The authors' codes are adopted and modified.
The program will output an isosurface mesh -- outputmesh.ply. It also generates outputmesh_sharpedge.obj (sharp edges detected by checking dihedral angles) and outputmesh.mlp (MeshLab project file). You can open outputmesh.mlp from MeshLab to visualize both the mesh and sharp edges.
Usage: Isosurface extraction for customized implicit functions
Please check the small project App\console and modify App\console\MyImplicitFunc.h to define your implicit function.  You only need to implement is_inside, scalar_value and gradient functions.
I also integrated other marching cube variants for testing, including MC -- classic marching cubes, MC_33 -- Marching Cubes 33, DMC -- Dual Marching Cubes.
Note that App\console project uses CPUs only.
Contact
Please contact me (Yang Liu yangliu@microsoft.com) if you have any question about this implementation.
Third Party Code in use
- IsoEx: src code of the paper --- Feature Sensitive Surface Extraction from Volume Data, SIGGRAPH 2001.
 - OpenMesh: OpenMesh Lib used by IsoEx.
 - Dual Contouring: src code of the paper --- Dual Contouring on Hermite Data, SIGGRAPH 2001.
 - cxxopts: c++ command line option parser
 - termcolor: print colored messages
 - Happly: PLY file format parser.
 - Dual MC: The implementation of Dual Marching Cubes by Dominik Wodniok.
 - TriangleMeshDistance: signed distance function to a triangle mesh, used for evaluating isosurface quality.
 Marching Cubes 33: Marching Cubes 33 algorithm.CIsoSurface: An implementation of Marching Cubes algorithm.