Exemplo n.º 1
0
//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");
}
Exemplo n.º 2
0
//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()));
}
Exemplo n.º 3
0
//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);
}