image_framework_ymj/include/open3d/visualization/rendering/MatrixInteractorLogic.h

87 lines
3.0 KiB
C
Raw Normal View History

2024-12-06 16:25:16 +08:00
// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2023 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
#pragma once
#include "open3d/geometry/BoundingVolume.h"
#include "open3d/visualization/rendering/Camera.h"
namespace open3d {
namespace visualization {
namespace rendering {
/// Base class for rotating and dollying (translating along forward axis).
/// Could be used for a camera, or also something else, like a the
/// direction of a directional light.
class MatrixInteractorLogic {
public:
virtual ~MatrixInteractorLogic();
void SetViewSize(int width, int height);
int GetViewWidth() const;
int GetViewHeight() const;
const geometry::AxisAlignedBoundingBox& GetBoundingBox() const;
virtual void SetBoundingBox(const geometry::AxisAlignedBoundingBox& bounds);
Eigen::Vector3f GetCenterOfRotation() const;
void SetMouseDownInfo(const Camera::Transform& matrix,
const Eigen::Vector3f& center_of_rotation);
const Camera::Transform& GetMatrix() const;
/// Rotates about an axis defined by dx * matrixLeft, dy * matrixUp.
/// `dy` is assumed to be in window-style coordinates, that is, going
/// up produces a negative dy. The axis goes through the center of
/// rotation.
virtual void Rotate(int dx, int dy);
/// Same as Rotate() except that the dx-axis and the dy-axis are
/// specified
virtual void RotateWorld(int dx,
int dy,
const Eigen::Vector3f& x_axis,
const Eigen::Vector3f& y_axis);
/// Rotates about the forward axis of the matrix
virtual void RotateZ(int dx, int dy);
virtual void RotateZWorld(int dx, int dy, const Eigen::Vector3f& forward);
enum class DragType { MOUSE, WHEEL, TWO_FINGER };
/// Moves the matrix along the forward axis. (This is one type
/// of zoom.)
virtual void Dolly(float dy, DragType drag_type);
virtual void Dolly(float z_dist, Camera::Transform matrix);
private:
Camera::Transform matrix_;
protected:
int view_width_ = 1;
int view_height_ = 1;
double model_size_ = 20.0;
geometry::AxisAlignedBoundingBox model_bounds_;
Eigen::Vector3f center_of_rotation_;
Camera::Transform matrix_at_mouse_down_;
Eigen::Vector3f center_of_rotation_at_mouse_down_;
void SetMatrix(const Camera::Transform& matrix);
float CalcRotateRadians(int dx, int dy);
float CalcRotateZRadians(int dx, int dy);
float CalcDollyDist(float dy,
DragType drag_type,
const Camera::Transform& matrix);
};
} // namespace rendering
} // namespace visualization
} // namespace open3d