87 lines
3.0 KiB
C
87 lines
3.0 KiB
C
![]() |
// ----------------------------------------------------------------------------
|
||
|
// - 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
|