void GLPointCloudViewer::paintGL()
{
    if (pointCloud.size() < 1)
        return;

    // Clear color and depth buffer
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    // Draw geometry
    if (currentCloud < 0 || currentCloud > pointCloud.size() - 1)
    {
        for (auto cloud : pointCloud)
            renderCloud(cloud->getShaderProgram().get(), cloud.get());
    }
    else
    {
        auto cloud = pointCloud[currentCloud];
        renderCloud(cloud->getShaderProgram().get(), cloud.get());
    }


}
示例#2
0
void
MeshSource<PointT>::loadOrGenerate (const std::string & model_path, ModelT & model)
{
    const std::string views_path = path_ + "/" + model.class_ + "/" + model.id_ + "/views";

    model.views_.clear();
    model.poses_.clear();
    model.self_occlusions_.clear();
    model.assembled_.reset (new pcl::PointCloud<PointT>);
    uniform_sampling (model_path, 100000, *model.assembled_, model_scale_);

    if(compute_normals_)
        model.computeNormalsAssembledCloud(radius_normals_);

    if (v4r::io::existsFolder(views_path))
    {
        if(load_into_memory_) {
            model.view_filenames_ = v4r::io::getFilesInDirectory(views_path, ".*" + view_prefix_ + ".*.pcd", false);
            loadInMemorySpecificModel(model);
        }
    }
    else
    {
        int img_width = resolution_;
        int img_height = resolution_;

        if(!renderer_)
            renderer_.reset( new DepthmapRenderer(img_width, img_height) );

        // To preserve Kinect camera parameters (640x480 / f=525)
        const float f = 150.f;
        const float cx = img_width / 2.f;
        const float cy = img_height / 2.f;
        renderer_->setIntrinsics(f, f, cx, cy);
        DepthmapRendererModel rmodel(model_path);
        renderer_->setModel(&rmodel);

        std::vector<Eigen::Vector3f> sphere = renderer_->createSphere(radius_sphere_, tes_level_);

        for(const Eigen::Vector3f &point : sphere) {
            Eigen::Matrix4f orientation = renderer_->getPoseLookingToCenterFrom(point); //get a camera pose looking at the center:
            renderer_->setCamPose(orientation);
            float visible;
            typename pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PointT>(renderCloud(*renderer_, visible)));
            const Eigen::Matrix4f tf = v4r::RotTrans2Mat4f(cloud->sensor_orientation_, cloud->sensor_origin_);

            // reset view point otherwise pcl visualization is potentially messed up
            Eigen::Vector4f zero_origin; zero_origin[0] = zero_origin[1] = zero_origin[2] = zero_origin[3] = 0.f;
            cloud->sensor_orientation_ = Eigen::Quaternionf::Identity();
            cloud->sensor_origin_ = zero_origin;

            if(!gen_organized_)   // remove nan points from cloud
            {
                size_t kept=0;
                for(size_t idx=0; idx<cloud->points.size(); idx++)
                {
                    const PointT &pt = cloud->points[idx];
                    if ( pcl::isFinite(pt) )
                        cloud->points[kept++] = pt;
                }
                cloud->points.resize(kept);
                cloud->width = kept;
                cloud->height = 1;
            }

            model.views_.push_back (cloud);
            model.poses_.push_back (tf);
            model.self_occlusions_.push_back (0); // NOT IMPLEMENTED
        }

        const std::string direc = path_ + "/" + model.class_ + "/" + model.id_ + "/views/";
        v4r::io::createDirIfNotExist(direc);

        for (size_t i = 0; i < model.views_.size (); i++)
        {
            //save generated model for future use
            std::stringstream path_view;
            path_view << direc << "/" << view_prefix_ << i << ".pcd";
            pcl::io::savePCDFileBinary (path_view.str (), *(model.views_[i]));

            std::stringstream path_pose;
            path_pose << direc << "/" << pose_prefix_ << i << ".txt";
            v4r::io::writeMatrixToFile( path_pose.str (), model.poses_[i]);

            std::stringstream path_entropy;
            path_entropy << direc << "/" << entropy_prefix_ << i << ".txt";
            v4r::io::writeFloatToFile (path_entropy.str (), model.self_occlusions_[i]);
        }

        loadOrGenerate ( model_path, model);
    }
}