//ImplicitFuncMesh3DAccurate ImplicitFuncMesh3DAccurate::ImplicitFuncMesh3DAccurate(const ObjMesh& mesh,const scalar& cellSz,const BBox<scalar>& bb):_cellSz(cellSz) { const vector<Vec3,Eigen::aligned_allocator<Vec3> >& vv=mesh.getV(); const vector<Vec3i,Eigen::aligned_allocator<Vec3i> >& vi=mesh.getI(); const vector<Vec3,Eigen::aligned_allocator<Vec3> >& tnor=mesh.getTN(); const vector<Vec3,Eigen::aligned_allocator<Vec3> >& nor=mesh.getN(); _bb=bb; _mesh.reset(new MeshSLC()); //copy verts _mesh->_verts.resize(vv.size()); for(sizeType i=0; i<(sizeType)vv.size(); i++) _mesh->_verts[i]=Vec3SLC(vv[i].x(),vv[i].y(),vv[i].z()); //copy inds _mesh->_inds.resize(vi.size()); for(sizeType i=0; i<(sizeType)vi.size(); i++) _mesh->_inds[i]=Vec3i(vi[i].x(),vi[i].y(),vi[i].z()); //copy nors _mesh->_nors.resize(nor.size()); for(sizeType i=0; i<(sizeType)nor.size(); i++) _mesh->_nors[i]=Vec3SLC(nor[i].x(),nor[i].y(),nor[i].z()); //copy tnors _mesh->_tnors.resize(tnor.size()); for(sizeType i=0; i<(sizeType)tnor.size(); i++) _mesh->_tnors[i]=Vec3SLC(tnor[i].x(),tnor[i].y(),tnor[i].z()); _mesh->searchNeigh(); //initialize BVH _bvh.reset(new AABBvh(_mesh.get())); //initialize octree BBox<scalarD> bbD; bbD.copy(_bb); const Vec3SLC cellSzD(cellSz,cellSz,cellSz); sizeType level=0; { const sizeType maxCellDim=(sizeType)std::ceil(_bb.getExtent().maxCoeff()/cellSz); while((((sizeType)1)<<level) < maxCellDim) level++; } INFO("Building Distance Octree"); _octree.reset(new OctreeDistance(bbD,cellSzD,level,_helper)); if(!_octree->buildFromAABBvhTopDown(_bvh.get(),false)){ NOTIFY_MSG("Fail Building OctDistanceTree, Check Your Mesh!") } INFO("Built"); }
//ImplicitFuncMesh3D ImplicitFuncMesh3D::ImplicitFuncMesh3D(const ObjMesh& mesh,const scalar& cellSz,const BBox<scalar>& bb):_cellSz(cellSz) { const vector<Vec3,Eigen::aligned_allocator<Vec3> >& vv=mesh.getV(); const vector<Vec3i,Eigen::aligned_allocator<Vec3i> >& vi=mesh.getI(); _bb=bb; _mesh.reset(new MeshSLC()); //copy verts _mesh->_verts.resize(vv.size()); for(sizeType i=0; i<(sizeType)vv.size(); i++) _mesh->_verts[i]=Vec3SLC(vv[i].x(),vv[i].y(),vv[i].z()); //copy inds _mesh->_inds.resize(vi.size()); for(sizeType i=0; i<(sizeType)vi.size(); i++) _mesh->_inds[i]=Vec3i(vi[i].x(),vi[i].y(),vi[i].z()); //initialize BVH _bvh.reset(new AABBvh(_mesh.get())); }
//ImplicitFuncMesh2D ImplicitFuncMesh2D::ImplicitFuncMesh2D(const ObjMesh& mesh,const scalar& cellSz,const BBox<scalar>& bb):_cellSz(cellSz) { const vector<Vec3,Eigen::aligned_allocator<Vec3> >& vv=mesh.getV(); const vector<Vec3i,Eigen::aligned_allocator<Vec3i> >& vi=mesh.getI(); const BBoxf meshBB=mesh.getBB(); const scalarF ext=(scalarF)bb.getExtent().maxCoeff(); _bb=bb; _mesh.reset(new MeshSLC()); //copy verts _mesh->_verts.resize(vv.size()); for(sizeType i=0; i<(sizeType)vv.size(); i++) _mesh->_verts[i]=Vec3SLC(vv[i].x(),vv[i].y(),vv[i].z()); //copy inds _mesh->_inds.resize(vi.size()); for(sizeType i=0; i<(sizeType)vi.size(); i++) _mesh->_inds[i]=Vec3i(vi[i].x(),vi[i].y(),vi[i].z()); //initialize BVH _bvh.reset(new AABBvh(_mesh.get())); //copy to grid Vec3i nrCell=ceil((Vec3)(bb.getExtent()/cellSz)); BBox<scalar> bbLs(Vec3(bb._minC.x()-ext*0.1f,bb._minC.y()-ext*0.1f,0.0f), Vec3(bb._maxC.x()+ext*0.1f,bb._maxC.y()+ext*0.1f,0.0f)); _ls.reset(nrCell,bbLs,0.0f); for(sizeType x=0; x<nrCell.x(); x++) { //INFOV("X: %d",x) for(sizeType y=0; y<nrCell.y(); y++) { const Vec3 pos=_ls.getPt(Vec3i(x,y,0)); Vec3SLC a(pos.x(),pos.y(),pos.z()); a.z()=meshBB._minC.z()-cellSz; Vec3SLC b(pos.x(),pos.y(),pos.z()); b.z()=meshBB._maxC.z()+cellSz; _ls.get(Vec3i(x,y,0))=_bvh->intersectLineSeg3D(a,b,0) ? -_cellSz : _cellSz; } } GridOp<scalar,scalar>::reinitialize(_ls); GridOp<scalar,scalar>::write2DScalarGridVTK("./levelSet.vtk",_ls); }