38 #define SELECTION_BUFFER_IMAGE_IDX 0
39 #define SELECTION_BUFFER_POINT_IDX 1
49 const Eigen::Vector4f
kGridColor(0.2f, 0.2f, 0.2f, 0.6f);
58 inline size_t RGBToIndex(
const uint8_t r,
const uint8_t g,
const uint8_t b) {
59 return static_cast<size_t>(r) +
static_cast<size_t>(g) * 256 +
60 static_cast<size_t>(b) * 65536;
64 inline Eigen::Vector4f IndexToRGB(
const size_t index) {
65 Eigen::Vector4f
color;
66 color(0) = ((index & 0x000000FF) >> 0) / 255.0f;
67 color(1) = ((index & 0x0000FF00) >> 8) / 255.0f;
68 color(2) = ((index & 0x00FF0000) >> 16) / 255.0f;
73 void BuildImageModel(
const Image&
image,
const Camera& camera,
74 const float image_size,
const Eigen::Vector4f& plane_color,
75 const Eigen::Vector4f& frame_color,
76 std::vector<TrianglePainter::Data>* triangle_data,
77 std::vector<LinePainter::Data>* line_data) {
79 const float kBaseCameraWidth = 1024.0f;
80 const float image_width = image_size * camera.Width() / kBaseCameraWidth;
81 const float image_height = image_width *
static_cast<float>(camera.Height()) /
82 static_cast<float>(camera.Width());
83 const float image_extent = std::max(image_width, image_height);
84 const float camera_extent = std::max(camera.Width(), camera.Height());
85 const float camera_extent_world =
86 static_cast<float>(camera.ImageToWorldThreshold(camera_extent));
87 const float focal_length = 2.0f * image_extent / camera_extent_world;
89 const Eigen::Matrix<float, 3, 4> inv_proj_matrix =
90 image.InverseProjectionMatrix().cast<
float>();
94 const Eigen::Vector3f pc = inv_proj_matrix.rightCols<1>();
95 const Eigen::Vector3f tl =
97 Eigen::Vector4f(-image_width, image_height, focal_length, 1);
98 const Eigen::Vector3f tr =
100 Eigen::Vector4f(image_width, image_height, focal_length, 1);
101 const Eigen::Vector3f br =
103 Eigen::Vector4f(image_width, -image_height, focal_length, 1);
104 const Eigen::Vector3f bl =
106 Eigen::Vector4f(-image_width, -image_height, focal_length, 1);
109 if (triangle_data !=
nullptr) {
110 triangle_data->emplace_back(
111 PointPainter::Data(tl(0), tl(1), tl(2), plane_color(0), plane_color(1),
112 plane_color(2), plane_color(3)),
113 PointPainter::Data(tr(0), tr(1), tr(2), plane_color(0), plane_color(1),
114 plane_color(2), plane_color(3)),
115 PointPainter::Data(bl(0), bl(1), bl(2), plane_color(0), plane_color(1),
116 plane_color(2), plane_color(3)));
118 triangle_data->emplace_back(
119 PointPainter::Data(bl(0), bl(1), bl(2), plane_color(0), plane_color(1),
120 plane_color(2), plane_color(3)),
121 PointPainter::Data(tr(0), tr(1), tr(2), plane_color(0), plane_color(1),
122 plane_color(2), plane_color(3)),
123 PointPainter::Data(br(0), br(1), br(2), plane_color(0), plane_color(1),
124 plane_color(2), plane_color(3)));
127 if (line_data !=
nullptr) {
130 line_data->emplace_back(
131 PointPainter::Data(pc(0), pc(1), pc(2), frame_color(0), frame_color(1),
132 frame_color(2), frame_color(3)),
133 PointPainter::Data(tl(0), tl(1), tl(2), frame_color(0), frame_color(1),
134 frame_color(2), frame_color(3)));
136 line_data->emplace_back(
137 PointPainter::Data(pc(0), pc(1), pc(2), frame_color(0), frame_color(1),
138 frame_color(2), frame_color(3)),
139 PointPainter::Data(tr(0), tr(1), tr(2), frame_color(0), frame_color(1),
140 frame_color(2), frame_color(3)));
142 line_data->emplace_back(
143 PointPainter::Data(pc(0), pc(1), pc(2), frame_color(0), frame_color(1),
144 frame_color(2), frame_color(3)),
145 PointPainter::Data(br(0), br(1), br(2), frame_color(0), frame_color(1),
146 frame_color(2), frame_color(3)));
148 line_data->emplace_back(
149 PointPainter::Data(pc(0), pc(1), pc(2), frame_color(0), frame_color(1),
150 frame_color(2), frame_color(3)),
151 PointPainter::Data(bl(0), bl(1), bl(2), frame_color(0), frame_color(1),
152 frame_color(2), frame_color(3)));
154 line_data->emplace_back(
155 PointPainter::Data(tl(0), tl(1), tl(2), frame_color(0), frame_color(1),
156 frame_color(2), frame_color(3)),
157 PointPainter::Data(tr(0), tr(1), tr(2), frame_color(0), frame_color(1),
158 frame_color(2), frame_color(3)));
160 line_data->emplace_back(
161 PointPainter::Data(tr(0), tr(1), tr(2), frame_color(0), frame_color(1),
162 frame_color(2), frame_color(3)),
163 PointPainter::Data(br(0), br(1), br(2), frame_color(0), frame_color(1),
164 frame_color(2), frame_color(3)));
166 line_data->emplace_back(
167 PointPainter::Data(br(0), br(1), br(2), frame_color(0), frame_color(1),
168 frame_color(2), frame_color(3)),
169 PointPainter::Data(bl(0), bl(1), bl(2), frame_color(0), frame_color(1),
170 frame_color(2), frame_color(3)));
172 line_data->emplace_back(
173 PointPainter::Data(bl(0), bl(1), bl(2), frame_color(0), frame_color(1),
174 frame_color(2), frame_color(3)),
175 PointPainter::Data(tl(0), tl(1), tl(2), frame_color(0), frame_color(1),
176 frame_color(2), frame_color(3)));
183 : QOpenGLWidget(parent),
186 image_viewer_widget_(
189 mouse_is_pressed_(false),
190 focus_distance_(kInitFocusDistance),
193 coordinate_grid_enabled_(true),
194 near_plane_(kInitNearPlane) {
195 background_color_[0] = 1.0f;
196 background_color_[1] = 1.0f;
197 background_color_[2] = 1.0f;
200 format.setDepthBufferSize(24);
201 format.setMajorVersion(3);
202 format.setMinorVersion(2);
204 format.setProfile(QSurfaceFormat::CoreProfile);
206 format.setOption(QSurfaceFormat::DebugContext);
209 QSurfaceFormat::setDefaultFormat(
format);
214 image_size_ =
static_cast<float>(devicePixelRatio() * image_size_);
215 point_size_ =
static_cast<float>(devicePixelRatio() * point_size_);
219 initializeOpenGLFunctions();
220 glEnable(GL_DEPTH_TEST);
222 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
223 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
229 glClearColor(background_color_[0], background_color_[1], background_color_[2],
231 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
233 const QMatrix4x4 pmv_matrix = projection_matrix_ * model_view_matrix_;
236 QMatrix4x4 model_view_center_matrix = model_view_matrix_;
237 const Eigen::Vector4f rot_center =
239 Eigen::Vector4f(0, 0, -focus_distance_, 1);
240 model_view_center_matrix.translate(rot_center(0), rot_center(1),
244 if (coordinate_grid_enabled_) {
245 const QMatrix4x4 pmvc_matrix =
246 projection_matrix_ * model_view_center_matrix;
252 point_painter_.
Render(pmv_matrix, point_size_);
257 image_triangle_painter_.
Render(pmv_matrix);
263 movie_grabber_triangle_painter_.
Render(pmv_matrix);
268 ComposeProjectionMatrix();
269 UploadCoordinateGridData();
286 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
288 "%d Images - %d Points",
static_cast<int>(
reg_image_ids.size()),
289 static_cast<int>(
points3D.size())));
292 "%d Images - %d Points",
static_cast<int>(
reg_image_ids.size()),
293 static_cast<int>(
points3D.size())));
309 return options_->
render->projection_type;
313 point_colormap_.reset(colormap);
317 image_colormap_.reset(colormap);
321 UploadMovieGrabberData();
326 coordinate_grid_enabled_ =
true;
331 coordinate_grid_enabled_ =
false;
339 const float prev_focus_distance = focus_distance_;
341 focus_distance_ -= diff;
344 diff = prev_focus_distance - focus_distance_;
347 diff = prev_focus_distance - focus_distance_;
349 const Eigen::Matrix4f vm_mat =
QMatrixToEigen(model_view_matrix_).inverse();
350 const Eigen::Vector3f tvec(0, 0, diff);
351 const Eigen::Vector3f tvec_rot = vm_mat.block<3, 3>(0, 0) * tvec;
352 model_view_matrix_.translate(tvec_rot(0), tvec_rot(1), tvec_rot(2));
353 ComposeProjectionMatrix();
354 UploadCoordinateGridData();
364 ComposeProjectionMatrix();
365 UploadCoordinateGridData();
379 const float prev_x,
const float prev_y) {
380 if (
x - prev_x == 0 &&
y - prev_y == 0) {
389 const Eigen::Vector3f u = PositionToArcballVector(
x,
y);
390 const Eigen::Vector3f v = PositionToArcballVector(prev_x, prev_y);
393 const float angle = 2.0f * std::acos(std::min(1.0f, u.dot(v)));
395 const float kMinAngle = 1e-3f;
396 if (angle > kMinAngle) {
397 const Eigen::Matrix4f vm_mat =
QMatrixToEigen(model_view_matrix_).inverse();
400 Eigen::Vector3f axis = vm_mat.block<3, 3>(0, 0) * v.cross(u);
401 axis = axis.normalized();
403 const Eigen::Vector4f rot_center =
404 vm_mat * Eigen::Vector4f(0, 0, -focus_distance_, 1);
406 model_view_matrix_.translate(rot_center(0), rot_center(1), rot_center(2));
407 model_view_matrix_.rotate(
RadToDeg(angle), axis(0), axis(1), axis(2));
408 model_view_matrix_.translate(-rot_center(0), -rot_center(1),
415 const float prev_x,
const float prev_y) {
416 if (
x - prev_x == 0 &&
y - prev_y == 0) {
420 Eigen::Vector3f tvec(
x - prev_x, prev_y -
y, 0.0f);
422 if (options_->
render->projection_type ==
423 RenderOptions::ProjectionType::PERSPECTIVE) {
425 }
else if (options_->
render->projection_type ==
426 RenderOptions::ProjectionType::ORTHOGRAPHIC) {
427 tvec *= 2.0f * OrthographicWindowExtent() /
height();
430 const Eigen::Matrix4f vm_mat =
QMatrixToEigen(model_view_matrix_).inverse();
432 const Eigen::Vector3f tvec_rot = vm_mat.block<3, 3>(0, 0) * tvec;
433 model_view_matrix_.translate(tvec_rot(0), tvec_rot(1), tvec_rot(2));
445 UploadMovieGrabberData();
455 return model_view_matrix_;
459 model_view_matrix_ = matrix;
467 glDisable(GL_MULTISAMPLE);
469 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
470 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
473 UploadImageData(
true);
474 UploadPointData(
true);
477 const QMatrix4x4 pmv_matrix = projection_matrix_ * model_view_matrix_;
478 image_triangle_painter_.
Render(pmv_matrix);
479 point_painter_.
Render(pmv_matrix, 2 * point_size_);
481 const int scaled_x = devicePixelRatio() *
x;
482 const int scaled_y = devicePixelRatio() * (
height() -
y - 1);
484 QOpenGLFramebufferObjectFormat fbo_format;
485 fbo_format.setSamples(0);
486 QOpenGLFramebufferObject fbo(1, 1, fbo_format);
488 glBindFramebuffer(GL_READ_FRAMEBUFFER, defaultFramebufferObject());
489 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo.handle());
490 glBlitFramebuffer(scaled_x, scaled_y, scaled_x + 1, scaled_y + 1, 0, 0, 1, 1,
491 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);
494 std::array<uint8_t, 3>
color;
495 glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE,
color.data());
500 if (index < selection_buffer_.size()) {
501 const char buffer_type = selection_buffer_[index].second;
503 selected_image_id_ =
static_cast<image_t>(selection_buffer_[index].first);
508 selected_point3D_id_ = selection_buffer_[index].first;
513 image_viewer_widget_->hide();
518 image_viewer_widget_->hide();
522 glEnable(GL_MULTISAMPLE);
524 selection_buffer_.clear();
528 UploadPointConnectionData();
529 UploadImageConnectionData();
535 selected_movie_grabber_view_ = view_idx;
536 UploadMovieGrabberData();
547 const int scaled_width =
static_cast<int>(devicePixelRatio() *
width());
548 const int scaled_height =
static_cast<int>(devicePixelRatio() *
height());
550 QOpenGLFramebufferObjectFormat fbo_format;
551 fbo_format.setSamples(0);
552 QOpenGLFramebufferObject fbo(scaled_width, scaled_height, fbo_format);
554 glBindFramebuffer(GL_READ_FRAMEBUFFER, defaultFramebufferObject());
555 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo.handle());
556 glBlitFramebuffer(0, 0, scaled_width, scaled_height, 0, 0, scaled_width,
557 scaled_height, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
561 QImage
image(scaled_width, scaled_height, QImage::Format_RGB888);
562 glReadPixels(0, 0, scaled_width, scaled_height, GL_RGB, GL_UNSIGNED_BYTE,
568 return image.mirrored();
574 point_viewer_widget_->
Show(point3D_id);
586 point_size_ = point_size;
590 image_size_ = image_size;
596 background_color_[0] = r;
597 background_color_[1] = g;
598 background_color_[2] = b;
602 void ModelViewerWidget::mousePressEvent(QMouseEvent*
event) {
603 if (mouse_press_timer_.isActive()) {
604 mouse_is_pressed_ =
false;
605 mouse_press_timer_.stop();
606 selection_buffer_.clear();
609 mouse_press_timer_.setSingleShot(
true);
611 mouse_is_pressed_ =
true;
612 prev_mouse_pos_ =
event->pos();
617 void ModelViewerWidget::mouseReleaseEvent(QMouseEvent*
event) {
618 mouse_is_pressed_ =
false;
622 void ModelViewerWidget::mouseMoveEvent(QMouseEvent*
event) {
623 if (mouse_is_pressed_) {
624 if (
event->buttons() & Qt::RightButton ||
625 (
event->buttons() & Qt::LeftButton &&
626 event->modifiers() & Qt::ControlModifier)) {
628 prev_mouse_pos_.y());
629 }
else if (
event->buttons() & Qt::LeftButton) {
631 prev_mouse_pos_.y());
634 prev_mouse_pos_ =
event->pos();
638 void ModelViewerWidget::wheelEvent(QWheelEvent*
event) {
640 if (
event->modifiers() & Qt::ControlModifier) {
642 }
else if (
event->modifiers() & Qt::AltModifier) {
644 }
else if (
event->modifiers() & Qt::ShiftModifier) {
652 void ModelViewerWidget::SetupPainters() {
655 coordinate_axes_painter_.
Setup();
656 coordinate_grid_painter_.
Setup();
658 point_painter_.
Setup();
659 point_connection_painter_.
Setup();
661 image_line_painter_.
Setup();
662 image_triangle_painter_.
Setup();
663 image_connection_painter_.
Setup();
665 movie_grabber_path_painter_.
Setup();
666 movie_grabber_line_painter_.
Setup();
667 movie_grabber_triangle_painter_.
Setup();
670 void ModelViewerWidget::SetupView() {
674 model_view_matrix_.setToIdentity();
675 model_view_matrix_.translate(0, 0, -focus_distance_);
676 model_view_matrix_.rotate(225, 1, 0, 0);
677 model_view_matrix_.rotate(-45, 0, 1, 0);
680 void ModelViewerWidget::Upload() {
684 ComposeProjectionMatrix();
688 UploadMovieGrabberData();
689 UploadPointConnectionData();
690 UploadImageConnectionData();
695 void ModelViewerWidget::UploadCoordinateGridData() {
698 const float scale = ZoomScale();
701 std::vector<LinePainter::Data> grid_data(3);
703 grid_data[0].point1 =
706 grid_data[0].point2 =
710 grid_data[1].point1 =
713 grid_data[1].point2 =
717 grid_data[2].point1 =
720 grid_data[2].point2 =
724 coordinate_grid_painter_.
Upload(grid_data);
727 std::vector<LinePainter::Data> axes_data(3);
729 axes_data[0].point1 = PointPainter::Data(
731 axes_data[0].point2 =
735 axes_data[1].point1 = PointPainter::Data(
737 axes_data[1].point2 =
741 axes_data[2].point1 = PointPainter::Data(
743 axes_data[2].point2 =
747 coordinate_axes_painter_.
Upload(axes_data);
750 void ModelViewerWidget::UploadPointData(
const bool selection_mode) {
753 std::vector<PointPainter::Data>
data;
758 const size_t min_track_len =
759 static_cast<size_t>(options_->
render->min_track_len);
762 images.count(selected_image_id_) == 0) {
763 for (
const auto& point3D :
points3D) {
764 if (point3D.second.Error() <= options_->
render->max_error &&
765 point3D.second.Track().Length() >= min_track_len) {
766 PointPainter::Data painter_point;
768 painter_point.x =
static_cast<float>(point3D.second.XYZ(0));
769 painter_point.y =
static_cast<float>(point3D.second.XYZ(1));
770 painter_point.z =
static_cast<float>(point3D.second.XYZ(2));
772 Eigen::Vector4f
color;
773 if (selection_mode) {
774 const size_t index = selection_buffer_.size();
775 selection_buffer_.push_back(
777 color = IndexToRGB(index);
779 }
else if (point3D.first == selected_point3D_id_) {
782 color = point_colormap_->ComputeColor(point3D.first, point3D.second);
785 painter_point.r =
color(0);
786 painter_point.g =
color(1);
787 painter_point.b =
color(2);
788 painter_point.a =
color(3);
790 data.push_back(painter_point);
794 const auto& selected_image =
images[selected_image_id_];
795 for (
const auto& point3D :
points3D) {
796 if (point3D.second.Error() <= options_->
render->max_error &&
797 point3D.second.Track().Length() >= min_track_len) {
798 PointPainter::Data painter_point;
800 painter_point.x =
static_cast<float>(point3D.second.XYZ(0));
801 painter_point.y =
static_cast<float>(point3D.second.XYZ(1));
802 painter_point.z =
static_cast<float>(point3D.second.XYZ(2));
804 Eigen::Vector4f
color;
805 if (selection_mode) {
806 const size_t index = selection_buffer_.size();
807 selection_buffer_.push_back(
809 color = IndexToRGB(index);
810 }
else if (selected_image.HasPoint3D(point3D.first)) {
812 }
else if (point3D.first == selected_point3D_id_) {
815 color = point_colormap_->ComputeColor(point3D.first, point3D.second);
818 painter_point.r =
color(0);
819 painter_point.g =
color(1);
820 painter_point.b =
color(2);
821 painter_point.a =
color(3);
823 data.push_back(painter_point);
831 void ModelViewerWidget::UploadPointConnectionData() {
834 std::vector<LinePainter::Data> line_data;
838 point_connection_painter_.
Upload(line_data);
842 const auto& point3D =
points3D[selected_point3D_id_];
845 LinePainter::Data line;
846 line.point1 = PointPainter::Data(
847 static_cast<float>(point3D.XYZ(0)),
static_cast<float>(point3D.XYZ(1)),
852 for (
const auto& track_el : point3D.Track().Elements()) {
853 const Image& conn_image =
images[track_el.image_id];
854 const Eigen::Vector3f conn_proj_center =
855 conn_image.ProjectionCenter().cast<
float>();
856 line.point2 = PointPainter::Data(
857 conn_proj_center(0), conn_proj_center(1), conn_proj_center(2),
860 line_data.push_back(line);
863 point_connection_painter_.
Upload(line_data);
866 void ModelViewerWidget::UploadImageData(
const bool selection_mode) {
869 std::vector<LinePainter::Data> line_data;
872 std::vector<TrianglePainter::Data> triangle_data;
879 Eigen::Vector4f plane_color;
880 Eigen::Vector4f frame_color;
881 if (selection_mode) {
882 const size_t index = selection_buffer_.size();
883 selection_buffer_.push_back(
885 plane_color = frame_color = IndexToRGB(index);
887 if (image_id == selected_image_id_) {
891 image_colormap_->ComputeColor(
image, &plane_color, &frame_color);
897 BuildImageModel(
image, camera, image_size_, plane_color, frame_color,
898 &triangle_data, selection_mode ?
nullptr : &line_data);
901 image_line_painter_.
Upload(line_data);
902 image_triangle_painter_.
Upload(triangle_data);
905 void ModelViewerWidget::UploadImageConnectionData() {
908 std::vector<LinePainter::Data> line_data;
909 std::vector<image_t> image_ids;
913 image_ids.push_back(selected_image_id_);
914 }
else if (options_->
render->image_connections) {
918 image_connection_painter_.
Upload(line_data);
922 for (
const image_t image_id : image_ids) {
925 const Eigen::Vector3f proj_center =
image.ProjectionCenter().cast<
float>();
928 std::unordered_set<image_t> conn_image_ids;
930 for (
const Point2D& point2D :
image.Points2D()) {
931 if (point2D.HasPoint3D()) {
933 for (
const auto& track_elem : point3D.Track().Elements()) {
934 conn_image_ids.insert(track_elem.image_id);
940 LinePainter::Data line;
941 line.point1 = PointPainter::Data(
942 proj_center(0), proj_center(1), proj_center(2),
947 for (
const image_t conn_image_id : conn_image_ids) {
948 const Image& conn_image =
images[conn_image_id];
949 const Eigen::Vector3f conn_proj_center =
950 conn_image.ProjectionCenter().cast<
float>();
951 line.point2 = PointPainter::Data(
952 conn_proj_center(0), conn_proj_center(1), conn_proj_center(2),
955 line_data.push_back(line);
959 image_connection_painter_.
Upload(line_data);
962 void ModelViewerWidget::UploadMovieGrabberData() {
965 std::vector<LinePainter::Data> path_data;
966 path_data.reserve(movie_grabber_widget_->
views.size());
968 std::vector<LinePainter::Data> line_data;
969 line_data.reserve(4 * movie_grabber_widget_->
views.size());
971 std::vector<TrianglePainter::Data> triangle_data;
972 triangle_data.reserve(2 * movie_grabber_widget_->
views.size());
974 if (movie_grabber_widget_->
views.size() > 0) {
975 const Image& image0 = movie_grabber_widget_->
views[0];
976 Eigen::Vector3f prev_proj_center = image0.ProjectionCenter().cast<
float>();
978 for (
size_t i = 1; i < movie_grabber_widget_->
views.size(); ++i) {
979 const Image&
image = movie_grabber_widget_->
views[i];
980 const Eigen::Vector3f curr_proj_center =
981 image.ProjectionCenter().cast<
float>();
982 LinePainter::Data
path;
983 path.point1 = PointPainter::Data(
984 prev_proj_center(0), prev_proj_center(1), prev_proj_center(2),
987 path.point2 = PointPainter::Data(
988 curr_proj_center(0), curr_proj_center(1), curr_proj_center(2),
991 path_data.push_back(
path);
992 prev_proj_center = curr_proj_center;
996 const float kDefaultImageWdith = 2048.0f;
997 const float kDefaultImageHeight = 1536.0f;
998 const float focal_length =
1002 kDefaultImageWdith, kDefaultImageHeight);
1005 for (
size_t i = 0; i < movie_grabber_widget_->
views.size(); ++i) {
1006 const Image&
image = movie_grabber_widget_->
views[i];
1007 Eigen::Vector4f plane_color;
1008 Eigen::Vector4f frame_color;
1009 if (i == selected_movie_grabber_view_) {
1017 BuildImageModel(
image, camera, image_size_, plane_color, frame_color,
1018 &triangle_data, &line_data);
1022 movie_grabber_path_painter_.
Upload(path_data);
1023 movie_grabber_line_painter_.
Upload(line_data);
1024 movie_grabber_triangle_painter_.
Upload(triangle_data);
1027 void ModelViewerWidget::ComposeProjectionMatrix() {
1028 projection_matrix_.setToIdentity();
1029 if (options_->
render->projection_type ==
1030 RenderOptions::ProjectionType::PERSPECTIVE) {
1031 projection_matrix_.perspective(
kFieldOfView, AspectRatio(), near_plane_,
1033 }
else if (options_->
render->projection_type ==
1034 RenderOptions::ProjectionType::ORTHOGRAPHIC) {
1035 const float extent = OrthographicWindowExtent();
1036 projection_matrix_.ortho(-AspectRatio() * extent, AspectRatio() * extent,
1037 -extent, extent, near_plane_,
kFarPlane);
1041 float ModelViewerWidget::ZoomScale()
const {
1044 std::abs(focus_distance_) /
height();
1047 float ModelViewerWidget::AspectRatio()
const {
1048 return static_cast<float>(
width()) /
static_cast<float>(
height());
1051 float ModelViewerWidget::OrthographicWindowExtent()
const {
1055 Eigen::Vector3f ModelViewerWidget::PositionToArcballVector(
1056 const float x,
const float y)
const {
1057 Eigen::Vector3f vec(2.0f *
x /
width() - 1, 1 - 2.0f *
y /
height(), 0.0f);
1058 const float norm2 = vec.squaredNorm();
1059 if (norm2 <= 1.0f) {
1060 vec.z() = std::sqrt(1.0f - norm2);
1062 vec = vec.normalized();
std::shared_ptr< core::Tensor > image
filament::Texture::InternalFormat format
double qtCompatWheelEventDelta(const QWheelEvent *event) noexcept
void Render(const QMatrix4x4 &pmv_matrix, const int width, const int height, const float line_width)
void Upload(const std::vector< LinePainter::Data > &data)
std::shared_ptr< RenderOptions > render
void Upload(const std::vector< PointPainter::Data > &data)
void Render(const QMatrix4x4 &pmv_matrix, const float point_size)
const class Image & Image(const image_t image_id) const
const std::unordered_map< camera_t, class Camera > & Cameras() const
const std::unordered_map< point3D_t, class Point3D > & Points3D() const
const std::vector< image_t > & RegImageIds() const
void Upload(const std::vector< TrianglePainter::Data > &data)
void Render(const QMatrix4x4 &pmv_matrix)
CLOUDVIEWER_HOST_DEVICE Pair< First, Second > make_pair(const First &_first, const Second &_second)
static const std::string path
float RadToDeg(const float rad)
Eigen::Matrix4f QMatrixToEigen(const QMatrix4x4 &matrix)
const point3D_t kInvalidPoint3DId
const image_t kInvalidImageId
float DegToRad(const float deg)
static const int model_id