2727#pragma warning (pop)
2828#endif
2929
30+ #include < iostream>
31+
3032namespace deform {
3133
32- template <class PrecisionType = typename MeshType::Scalar >
34+ template <class PrecisionType >
3335 class TrajectorySE3 {
3436 public:
3537
@@ -66,15 +68,13 @@ namespace deform {
6668 Transform delta = _keyframes[n - 2 ].inverse (Eigen::Isometry) * _keyframes[n - 1 ];
6769
6870 SE3Group g (delta.matrix ());
69- _omegas .push_back (g.log ());
71+ _omega .push_back (g.log ());
7072
7173 if (n == 2 ) {
72- Transform deltainv = delta.inverse (Eigen::Isometry);
73- SE3Group g (deltainv.matrix ());
74- _omegas[0 ] = g.log ();
74+ _omega[0 ] = g.inverse ().log ();
7575 }
7676 } else {
77- _omegas .push_back (SE3Group::Tangent::Zero ()); // Will be fixed when second keyframe is given.
77+ _omega .push_back (SE3Group::Tangent::Zero ()); // Will be fixed when second keyframe is given.
7878 }
7979 }
8080
@@ -88,39 +88,41 @@ namespace deform {
8888
8989 const Scalar u = s - Scalar (i);
9090 const Eigen::Matrix<Scalar, 4 , 1 > b = _C * Eigen::Matrix<Scalar, 4 , 1 >(Scalar (1 ), u, u*u, u*u*u);
91-
91+
9292 Transform trans = previousTransform (i);
93+
94+ Transform prod = Transform::Identity ();
9395 for (int j = 1 ; j < 4 ; ++j) {
94- SE3Group::Tangent o = omega (i + j);
95- std::cout << " omega is " << o.transpose () << std::endl;
96- std::cout << " b is" << b (j) << std::endl;
97- std::cout << " omega * b is " << (b (j) * o).transpose () << std::endl;
98-
99- trans = trans * SE3Group::exp (b (j) * o).affine3 ();
96+ typename SE3Group::Tangent o = omega (i + j);
97+ prod = prod * SE3Group::exp (b (j) * o).affine3 ();
10098 }
101-
102- return trans;
99+
100+ return trans * prod ;
103101 }
104102
105103 private:
106104
107105 typename SE3Group::Tangent omega (int idx) const {
108- if ((size_t )idx < _omegas.size ())
109- return _omegas[idx];
110- else
111- return _omegas.back ();
106+ if ((size_t )idx < _omega.size ()) {
107+ return _omega[idx];
108+ } else {
109+ // Extrapolate
110+ return _omega.back ();
111+ }
112112 }
113113
114114 Transform previousTransform (int idx) const {
115- if (idx == 0 )
116- return SE3Group::exp (_omegas[0 ]).affine3 () * _keyframes[0 ];
117- else
115+ if (idx == 0 ) {
116+ // Extrapolate
117+ return SE3Group::exp (_omega[0 ]).affine3 () * _keyframes[0 ];
118+ } else {
118119 return _keyframes[idx - 1 ];
120+ }
119121 }
120122
121123 Scalar _timeStep;
122124 std::vector<Transform, Eigen::aligned_allocator<Transform> > _keyframes;
123- std::vector<typename SE3Group::Tangent, Eigen::aligned_allocator<typename SE3Group::Tangent> > _omegas ;
125+ std::vector<typename SE3Group::Tangent, Eigen::aligned_allocator<typename SE3Group::Tangent> > _omega ;
124126 Eigen::Matrix<Scalar, 4 , 4 > _C;
125127 };
126128}
0 commit comments