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()); } }
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); } }