16 #include <GLFW/glfw3.h>
19 #include <Eigen/Dense>
23 namespace visualization {
43 "[ViewControl] SetViewPoint() failed because window height and "
44 "width are not set.");
134 "[ViewControl] ConvertToPinholeCameraParameters() failed "
135 "because window height and width are not set.");
140 "[ViewControl] ConvertToPinholeCameraParameters() failed "
141 "because orthogonal view cannot be translated to a pinhole "
149 intrinsic.intrinsic_matrix_.setIdentity();
151 double tan_half_fov = std::tan(fov_rad / 2.0);
152 intrinsic.intrinsic_matrix_(0, 0) = intrinsic.intrinsic_matrix_(1, 1) =
154 intrinsic.intrinsic_matrix_(0, 2) = (double)
window_width_ / 2.0 - 0.5;
155 intrinsic.intrinsic_matrix_(1, 2) = (double)
window_height_ / 2.0 - 0.5;
157 Eigen::Matrix4d extrinsic;
159 Eigen::Vector3d front_dir =
front_.normalized();
160 Eigen::Vector3d up_dir =
up_.normalized();
161 Eigen::Vector3d right_dir =
right_.normalized();
162 extrinsic.block<1, 3>(0, 0) = right_dir.transpose();
163 extrinsic.block<1, 3>(1, 0) = -up_dir.transpose();
164 extrinsic.block<1, 3>(2, 0) = -front_dir.transpose();
165 extrinsic(0, 3) = -right_dir.dot(
eye_);
166 extrinsic(1, 3) = up_dir.dot(
eye_);
167 extrinsic(2, 3) = front_dir.dot(
eye_);
168 extrinsic(3, 3) = 1.0;
175 bool allow_arbitrary) {
179 constexpr
double threshold = 1.e-6;
180 if (!allow_arbitrary &&
184 std::abs(intrinsic.intrinsic_matrix_(0, 2) -
186 std::abs(intrinsic.intrinsic_matrix_(1, 2) -
189 "[ViewControl] ConvertFromPinholeCameraParameters() failed "
190 "because window height and width do not match.");
193 double tan_half_fov =
194 (double)
window_height_ / (intrinsic.intrinsic_matrix_(1, 1) * 2.0);
195 double fov_rad = std::atan(tan_half_fov) * 2.0;
198 if (!allow_arbitrary) {
204 "[ViewControl] ConvertFromPinholeCameraParameters() failed "
205 "because field of view is impossible.");
209 right_ = extrinsic.block<1, 3>(0, 0).transpose();
210 up_ = -extrinsic.block<1, 3>(1, 0).transpose();
211 front_ = -extrinsic.block<1, 3>(2, 0).transpose();
212 eye_ = extrinsic.block<3, 3>(0, 0).inverse() *
213 (extrinsic.block<3, 1>(0, 3) * -1.0);
217 double ideal_zoom = ideal_distance *
221 if (!allow_arbitrary) {
232 return ProjectionType::Orthogonal;
242 up_ = Eigen::Vector3d(0.0, 1.0, 0.0);
243 front_ = Eigen::Vector3d(0.0, 0.0, 1.0);
293 front_ = (
front_ * std::cos(beta) +
up_ * std::sin(beta)).normalized();
313 up *
up_.normalized();
321 const double degrees_per_unit = 100 /
distance_;
PointCoordinateType GetMaxExtent() const
virtual Eigen::Vector3d GetMaxBound() const override
Returns max bounds for geometry coordinates.
virtual Eigen::Vector3d GetMinBound() const override
Returns min bounds for geometry coordinates.
virtual Eigen::Vector3d GetCenter() const override
Returns the center of the geometry coordinates.
virtual bool IsEmpty() const override
const Vector3Tpl< T > & maxCorner() const
Returns max corner (const)
void setValidity(bool state)
Sets bonding box validity.
const Vector3Tpl< T > & minCorner() const
Returns min corner (const)
Contains the pinhole camera intrinsic parameters.
Contains both intrinsic and extrinsic pinhole camera parameters.
PinholeCameraIntrinsic intrinsic_
PinholeCameraIntrinsic object.
Eigen::Matrix4d_u extrinsic_
Camera extrinsic parameters.
Eigen::Vector3d start_local_rotate_up_
static const double FIELD_OF_VIEW_STEP
gl_util::GLMatrix4f model_matrix_
bool ConvertFromViewParameters(const ViewParameters &status)
gl_util::GLMatrix4f view_matrix_
ProjectionType GetProjectionType() const
static const double FIELD_OF_VIEW_MAX
void SetFront(const Eigen::Vector3d &front)
gl_util::GLMatrix4f MVP_matrix_
void SetUp(const Eigen::Vector3d &up)
virtual void Translate(double x, double y, double xo=0.0, double yo=0.0)
Function to process translation.
virtual void Rotate(double x, double y, double xo=0.0, double yo=0.0)
Function to process rotation.
virtual void CameraLocalTranslate(double forward, double right, double up)
static const double FIELD_OF_VIEW_MIN
virtual void CameraLocalRotate(double x, double y, double xo=0.0, double yo=0.0)
static const double ZOOM_MIN
virtual void ChangeFieldOfView(double step)
gl_util::GLMatrix4f projection_matrix_
virtual void ChangeWindowSize(int width, int height)
bool ConvertFromPinholeCameraParameters(const camera::PinholeCameraParameters ¶meters, bool allow_arbitrary=false)
void SetLookat(const Eigen::Vector3d &lookat)
double local_rotate_up_accum_
virtual void Scale(double scale)
static const double ZOOM_MAX
Eigen::Vector3d start_local_rotate_front_
static const double ZOOM_STEP
double local_rotate_right_accum_
virtual void ResetCameraLocalRotate()
Eigen::Vector3d start_local_rotate_eye_
virtual void Roll(double x)
static const double FIELD_OF_VIEW_DEFAULT
void SetViewMatrices(const Eigen::Matrix4d &model_matrix=Eigen::Matrix4d::Identity())
bool ConvertToPinholeCameraParameters(camera::PinholeCameraParameters ¶meters)
void SetZoom(const double zoom)
void SetProjectionParameters()
static const double ZOOM_DEFAULT
Eigen::Vector3d start_local_rotate_lookat_
static const double ROTATION_RADIAN_PER_PIXEL
Eigen::Vector3d start_local_rotate_right_
bool ConvertToViewParameters(ViewParameters &status) const
Function to get equivalent view parameters (support orthogonal)
Eigen::Vector3d boundingbox_max_
Eigen::Vector3d boundingbox_min_
__host__ __device__ float dot(float2 a, float2 b)
__host__ __device__ int2 abs(int2 v)
GLMatrix4f LookAt(const Eigen::Vector3d &eye, const Eigen::Vector3d &lookat, const Eigen::Vector3d &up)
GLMatrix4f Perspective(double field_of_view_, double aspect, double z_near, double z_far)
GLMatrix4f Ortho(double left, double right, double bottom, double top, double z_near, double z_far)
Generic file read and write utility for python interface.