Skip to content

Commit 88b3833

Browse files
authored
backface culling (#307)
1 parent 82da8fe commit 88b3833

5 files changed

Lines changed: 35 additions & 8 deletions

File tree

include/glim/viewer/standard_viewer.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class StandardViewer : public ExtensionModule {
5858
std::atomic_bool kill_switch;
5959
std::thread thread;
6060

61+
bool enable_backface_culling;
62+
Eigen::Vector2f backface_culling_range;
63+
6164
bool enable_partial_rendering;
6265
int partial_rendering_budget;
6366

src/glim/mapping/sub_mapping.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,13 @@ void SubMapping::insert_keyframe(const int current, const EstimationFrame::Const
368368
for (int i = 0; i < frame->size(); i++) {
369369
frame->points[i] = odom_frame->T_lidar_imu.inverse() * frame->points[i];
370370
}
371-
frame->add_covs(covariance_estimation->estimate(frame->points_storage, odom_frame->raw_frame->neighbors));
371+
372+
std::vector<Eigen::Vector4d> normals;
373+
std::vector<Eigen::Matrix4d> covs;
374+
covariance_estimation->estimate(frame->points_storage, odom_frame->raw_frame->neighbors, normals, covs);
375+
frame->add_normals(normals);
376+
frame->add_covs(covs);
377+
372378
if (!odom_frame->raw_frame->intensities.empty()) {
373379
frame->add_intensities(odom_frame->raw_frame->intensities);
374380
}
@@ -487,16 +493,10 @@ SubMap::Ptr SubMapping::create_submap(bool force_create) const {
487493
#endif
488494

489495
if (submap->frame == nullptr) {
490-
submap->frame = gtsam_points::merge_frames_auto(poses_to_merge, keyframes_to_merge, params.submap_downsample_resolution);
496+
submap->frame = gtsam_points::merge_frames(poses_to_merge, keyframes_to_merge, params.submap_downsample_resolution, params.submap_target_num_points);
491497
}
492498
logger->debug("|merged_submap|={}", submap->frame->size());
493499

494-
if (params.submap_target_num_points > 0 && submap->frame->size() > params.submap_target_num_points) {
495-
std::mt19937 mt(submap_count * 643145 + submap->frame->size() * 4312); // Just a random-like seed
496-
submap->frame = gtsam_points::random_sampling(submap->frame, static_cast<double>(params.submap_target_num_points) / submap->frame->size(), mt);
497-
logger->debug("|subsampled_submap|={}", submap->frame->size());
498-
}
499-
500500
return submap;
501501
}
502502

src/glim/viewer/standard_viewer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ StandardViewer::StandardViewer() : logger(create_module_logger("viewer")) {
9393

9494
trajectory.reset(new TrajectoryManager);
9595

96+
enable_backface_culling = false;
97+
backface_culling_range = Eigen::Vector2f(0.0f, 1.1f);
98+
9699
enable_partial_rendering = config.param("standard_viewer", "enable_partial_rendering", false);
97100
partial_rendering_budget = config.param("standard_viewer", "partial_rendering_budget", 1024);
98101

src/glim/viewer/standard_viewer_callbacks.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ void StandardViewer::set_callbacks() {
8181
auto viewer = guik::LightViewer::instance();
8282
auto cloud_buffer = std::make_shared<glk::PointCloudBuffer>(new_frame->frame->points, new_frame->frame->size());
8383

84+
if (new_frame->frame->has_normals()) {
85+
cloud_buffer->add_normals(new_frame->frame->normals, new_frame->frame->size());
86+
}
87+
8488
std::vector<float> intensities;
8589
if (new_frame->raw_frame && new_frame->raw_frame->points.size() == new_frame->frame->size()) {
8690
intensities.resize(new_frame->raw_frame->intensities.size());
@@ -485,6 +489,9 @@ void StandardViewer::set_callbacks() {
485489

486490
auto viewer = guik::LightViewer::instance();
487491
auto cloud_buffer = std::make_shared<glk::PointCloudBuffer>(submap->frame->points, submap->frame->size());
492+
if (submap->frame->has_normals()) {
493+
cloud_buffer->add_normals(submap->frame->normals, submap->frame->size());
494+
}
488495
if (submap->frame->has_intensities()) {
489496
std::vector<float> intensities(submap->frame->intensities, submap->frame->intensities + submap->frame->size());
490497
cloud_buffer->add_colormap(intensities);

src/glim/viewer/standard_viewer_ui.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,20 @@ void StandardViewer::drawable_selection() {
240240
ImGui::SetNextItemWidth(60);
241241
ImGui::DragInt("Budget", &partial_rendering_budget, 1, 1, 1000000);
242242

243+
if (ImGui::Checkbox("Backface cull", &enable_backface_culling)) {
244+
if (enable_backface_culling) {
245+
viewer->enable_backface_culling();
246+
} else {
247+
viewer->disable_backface_culling();
248+
}
249+
}
250+
251+
ImGui::SameLine();
252+
ImGui::SetNextItemWidth(120);
253+
if (ImGui::DragFloatRange2("Range", &backface_culling_range[0], &backface_culling_range[1], 0.01f, -1.1f, 1.1f)) {
254+
viewer->set_backface_culling_range(backface_culling_range);
255+
}
256+
243257
ImGui::End();
244258

245259
if (show_odometry_status) {

0 commit comments

Comments
 (0)