ed
transform_cache.cpp
Go to the documentation of this file.
2 
3 namespace ed
4 {
5 
6 // --------------------------------------------------------------------------------------------------------------
7 
8 inline float clamp(float x, float a, float b) {
9  return x < a ? a : (x > b ? b : x);
10 }
11 
12 // --------------------------------------------------------------------------------------------------------------
13 
14 // Taken from: http://www.arcsynthesis.org/gltut/Positioning/Tut08%20Interpolation.html
15 geo::Quaternion slerp(const geo::Quaternion& v0, const geo::Quaternion& v1, float alpha)
16 {
17  float dot = v0.dot(v1);
18 
19  const float DOT_THRESHOLD = 0.9995f;
20  if (dot > DOT_THRESHOLD)
21  {
23  q.x = (1 - alpha) * v0.getX() + alpha * v1.getX();
24  q.y = (1 - alpha) * v0.getY() + alpha * v1.getY();
25  q.z = (1 - alpha) * v0.getZ() + alpha * v1.getZ();
26  q.w = (1 - alpha) * v0.getW() + alpha * v1.getW();
27 
28  return q;
29  }
30 
31  dot = clamp(dot, -1.0f, 1.0f);
32 
33  float theta_0 = acosf(dot);
34  float theta = theta_0*alpha;
35 
36  geo::Quaternion v2 = v1 - v0*dot;
37  v2.normalize();
38 
39  return v0*cos(theta) + v2*sin(theta);
40 }
41 
42 // --------------------------------------------------------------------------------------------------------------
43 
44 void interpolate(const geo::Transform& t1, const geo::Transform& t2, float alpha, geo::Pose3D& result)
45 {
46  result.t = (1.0f - alpha) * t1.getOrigin() + alpha * t2.getOrigin();
47  result.R.setRotation(slerp(t1.getQuaternion(), t2.getQuaternion(), alpha));
48 }
49 
50 // ----------------------------------------------------------------------------------------------------
51 
53 {
54 }
55 
56 // ----------------------------------------------------------------------------------------------------
57 
59 {
60 }
61 
62 // ----------------------------------------------------------------------------------------------------
63 
65 {
66  // Get lower and upper bound
68  cache_.getLowerUpper(t, lower, upper);
69 
70  if (lower == cache_.end())
71  {
72  if (upper == cache_.end())
73  // No upper or lower bound (cache is empty)
74  return false;
75 
76  // Requested time is in the past
77  tf = upper->second;
78  }
79  else
80  {
81  if (upper == cache_.end())
82  {
83  // Requested time is in the future
84  tf = lower->second;
85  }
86  else
87  {
88  // Interpolate
89  const geo::Pose3D& tf1 = lower->second;
90  const geo::Pose3D& tf2 = upper->second;
91 
92  double dt1 = t.seconds() - lower->first.seconds();
93  double t_diff = upper->first.seconds() - lower->first.seconds();
94 
95  float alpha = dt1 / t_diff;
96 
97  interpolate(tf1, tf2, alpha, tf);
98  }
99  }
100 
101  return true;
102 }
103 
104 } // end namespace ed
105 
geo::Mat3T::setRotation
void setRotation(const QuaternionT< T > &q)
ed::TransformCache::calculateTransform
bool calculateTransform(const Time &t, geo::Pose3D &tf) const
Definition: transform_cache.cpp:64
geo::QuaternionT
t
Timer t
a
void a()
ed::TransformCache::~TransformCache
~TransformCache()
Definition: transform_cache.cpp:58
ed::interpolate
void interpolate(const geo::Transform &t1, const geo::Transform &t2, float alpha, geo::Pose3D &result)
Definition: transform_cache.cpp:44
ed::slerp
geo::Quaternion slerp(const geo::Quaternion &v0, const geo::Quaternion &v1, float alpha)
Definition: transform_cache.cpp:15
geo::Transform::getOrigin
Vector3 getOrigin() const
geo::Transform3T
ed::Time
Definition: time.h:9
ed::TransformCache::cache_
TimeCache< geo::Pose3D > cache_
Definition: transform_cache.h:26
geo::QuaternionT::w
T w
ed::TimeCache::const_iterator
std::map< Time, T >::const_iterator const_iterator
Definition: time_cache.h:16
geo::QuaternionT::y
T y
geo::QuaternionT::normalize
void normalize()
geo::QuaternionT::x
T x
ed::clamp
float clamp(float x, float a, float b)
Definition: transform_cache.cpp:8
geo::Transform3T::t
Vec3T< T > t
geo::Transform
geo::QuaternionT::getZ
T getZ() const
ed::TransformCache::TransformCache
TransformCache()
Definition: transform_cache.cpp:52
b
void b()
geo::QuaternionT::getY
T getY() const
transform_cache.h
geo::QuaternionT::getX
T getX() const
geo::Transform3T::R
Mat3T< T > R
geo::QuaternionT::z
T z
ed
Definition: convex_hull.h:8
geo::QuaternionT::dot
T dot(const QuaternionT &q) const
geo::QuaternionT::getW
T getW() const