ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ViewInterpolate.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "ViewInterpolate.h"
9 
10 // CV_DB_LIB
11 #include <ecvPolyline.h>
12 #include <ecvViewportParameters.h>
13 
14 namespace cloudViewer {
15 
17  const ecvViewportParameters& m_view2,
18  unsigned int stepCount)
19  : m_view1(viewParams1),
20  m_view2(m_view2),
21  m_totalSteps(stepCount),
22  m_currentStep(0),
23  smoothTrajectory(nullptr),
24  smoothTrajectoryReversed(nullptr),
25  smoothTrajStartIndex(0),
26  smoothTrajStopIndex(0),
27  smoothTrajCurrentIndex(0),
28  smoothSegmentLength(0),
29  smoothCurrentLength(0) {}
30 
32  ccPolyline* _smoothTrajectoryReversed,
33  unsigned i1,
34  unsigned i2,
36  smoothTrajectory = _smoothTrajectory;
37  smoothTrajectoryReversed = _smoothTrajectoryReversed;
38  smoothTrajCurrentIndex = smoothTrajStartIndex = i1;
39  smoothTrajStopIndex = i2;
40  smoothSegmentLength = length;
41  smoothCurrentLength = 0;
42 }
43 
44 // helper function for interpolating between simple numerical types
45 template <class T>
46 T InterpolateNumber(T start, T end, double interpolationFraction) {
47  return static_cast<T>(
48  static_cast<double>(start) +
49  (static_cast<double>(end) - static_cast<double>(start)) *
50  interpolationFraction);
51 }
52 
54  double interpolate_fraction) const {
55  if (interpolate_fraction < 0.0 || interpolate_fraction > 1.0) {
56  return false;
57  }
58 
59  interpView = m_view1;
60  {
62  m_view1.defaultPointSize, m_view2.defaultPointSize,
63  interpolate_fraction);
65  m_view1.defaultLineWidth, m_view2.defaultLineWidth,
66  interpolate_fraction);
67  interpView.zNearCoef = InterpolateNumber(
68  m_view1.zNearCoef, m_view2.zNearCoef, interpolate_fraction);
69  interpView.zNear = InterpolateNumber(m_view1.zNear, m_view2.zNear,
70  interpolate_fraction);
71  interpView.zFar = InterpolateNumber(m_view1.zFar, m_view2.zFar,
72  interpolate_fraction);
73  interpView.fov_deg = InterpolateNumber(m_view1.fov_deg, m_view2.fov_deg,
74  interpolate_fraction);
76  m_view1.cameraAspectRatio, m_view2.cameraAspectRatio,
77  interpolate_fraction);
78  interpView.viewMat = ccGLMatrixd::Interpolate(
79  interpolate_fraction, m_view1.viewMat, m_view2.viewMat);
80  interpView.setPivotPoint(
81  m_view1.getPivotPoint() +
82  (m_view2.getPivotPoint() - m_view1.getPivotPoint()) *
83  interpolate_fraction,
84  false);
85  interpView.setCameraCenter(
86  m_view1.getCameraCenter() + (m_view2.getCameraCenter() -
87  m_view1.getCameraCenter()) *
88  interpolate_fraction,
89  true);
91  m_view1.getFocalDistance(), m_view2.getFocalDistance(),
92  interpolate_fraction));
93  }
94 
95  return true;
96 }
97 
99  if (m_currentStep >= m_totalSteps) {
100  return false;
101  }
102 
103  // interpolation fraction
104  double interpolate_fraction =
105  static_cast<double>(m_currentStep) / m_totalSteps;
106 
107  return interpolate(outViewport, interpolate_fraction);
108 }
109 
110 } // namespace cloudViewer
float PointCoordinateType
Type of the coordinates of a (N-D) point.
Definition: CVTypes.h:16
static ccGLMatrixTpl Interpolate(double coef, const ccGLMatrixTpl< double > &glMat1, const ccGLMatrixTpl< double > &glMat2)
Interpolates two matrices at relative position 'coef'.
Colored polyline.
Definition: ecvPolyline.h:24
bool interpolate(ecvViewportParameters &a_returned_viewport, double ratio) const
Interpolates the 2 viewports at a given (relative) position.
bool nextView(ecvViewportParameters &a_returned_viewport)
Returns the next viewport.
void setSmoothTrajectory(ccPolyline *smoothTrajectory, ccPolyline *smoothTrajectoryReversed, unsigned i1, unsigned i2, PointCoordinateType length)
Sets the smooth trajectory (optional)
ViewInterpolate(const ecvViewportParameters &view1, const ecvViewportParameters &view2, unsigned int stepCount=0)
Constructor from two viewports and a number of steps.
Standard parameters for GL displays/viewports.
double zNearCoef
Theoretical perspective 'zNear' relative position.
float defaultLineWidth
Line width.
float fov_deg
Camera F.O.V. (field of view) in degrees.
float cameraAspectRatio
Camera aspect ratio.
double zFar
Actual perspective 'zFar' value.
double getFocalDistance() const
Computes the 'focal' distance.
const CCVector3d & getCameraCenter() const
Returns the camera center.
float defaultPointSize
Point size.
void setPivotPoint(const CCVector3d &P, bool autoUpdateFocal=true)
Sets the pivot point (for object-centered view mode)
const CCVector3d & getPivotPoint() const
Returns the pivot point (for object-centered view mode)
ccGLMatrixd viewMat
Visualization matrix (rotation only)
void setCameraCenter(const CCVector3d &C, bool autoUpdateFocal=true)
Sets the camera center.
void setFocalDistance(double distance)
Sets the 'focal' distance.
double zNear
Actual perspective 'zNear' value.
__host__ __device__ float length(float2 v)
Definition: cutil_math.h:1162
Generic file read and write utility for python interface.
T InterpolateNumber(T start, T end, double interpolationFraction)