Skip to content

Commit 49603f3

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 5a49c15 + 47a4625 commit 49603f3

File tree

4 files changed

+80
-32
lines changed

4 files changed

+80
-32
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ target_sources(deform INTERFACE
2424
${CMAKE_CURRENT_SOURCE_DIR}/inc/deform/arap.h
2525
${CMAKE_CURRENT_SOURCE_DIR}/inc/deform/openmesh_adapter.h
2626
${CMAKE_CURRENT_SOURCE_DIR}/inc/deform/trajectory.h
27+
${CMAKE_CURRENT_SOURCE_DIR}/inc/deform/deformation_util.h
2728
)
2829

2930
add_executable(deform_tests

examples/deform_trajectory.cpp

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <deform/arap.h>
1919
#include <deform/openmesh_adapter.h>
2020
#include <deform/trajectory.h>
21+
#include <deform/deformation_util.h>
2122

2223
#include "osg_viewer.h"
2324
#include "example_config.h"
@@ -29,24 +30,14 @@
2930

3031

3132
const std::vector<int> handles = { 4,5,7,11,14,15,16,17,18,19,26,27,38,39,45,46,48,49,50,51,52,53,54,55,56,76,77,131,132,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,240,241,257,307,308,324,325,327,328,329,330,331,332,333,334,354,355 };
32-
33-
3433
const std::vector<int> anchors = {0,1,2,3,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385};
3534

3635

3736
typedef OpenMesh::TriMesh_ArrayKernelT<> Mesh;
3837
typedef deform::OpenMeshAdapter<> Adapter;
3938
typedef deform::AsRigidAsPossibleDeformation<Adapter, double> ARAP;
4039
typedef deform::TrajectorySE3<float> Trajectory;
41-
42-
43-
void applyTransformationToHandles(const Eigen::Affine3f &delta, Mesh &mesh, ARAP &arap) {
44-
for (auto h : handles) {
45-
Mesh::VertexHandle vh = mesh.vertex_handle(h);
46-
Eigen::Vector3f v = delta * deform::convert::toEigen(mesh.point(vh));
47-
arap.setConstraint(vh.idx(), v);
48-
}
49-
}
40+
typedef deform::DeformationUtil<Adapter> DeformationUtil;
5041

5142

5243
int main(int argc, char **argv) {
@@ -70,22 +61,14 @@ int main(int argc, char **argv) {
7061

7162
// Setup trajectory
7263
Trajectory trajectory;
73-
/*
74-
trajectory.addKeyPose(Trajectory::Transform::Identity());
75-
trajectory.addKeyPose(Trajectory::Transform::Identity() * Eigen::Translation3f(1.f,0.f,0.f));
76-
trajectory.addKeyPose(Trajectory::Transform::Identity() * Eigen::Translation3f(2.f, 0.f, 0.f));
77-
trajectory.addKeyPose(Trajectory::Transform::Identity() * Eigen::AngleAxisf((float)M_PI / 2.f, Eigen::Vector3f::UnitZ()) * Eigen::AngleAxisf((float)M_PI / 4.f, Eigen::Vector3f::UnitX()) * Eigen::Translation3f(2.f, 0.f, 0.f));
78-
*/
7964

80-
trajectory.addKeyPose(Trajectory::Transform::Identity());
81-
trajectory.addKeyPose(Eigen::AngleAxisf((float)0.2f, Eigen::Vector3f::UnitY()) * Trajectory::Transform::Identity());
82-
trajectory.addKeyPose(Eigen::AngleAxisf((float)0.4f, Eigen::Vector3f::UnitY()) * Trajectory::Transform::Identity());
83-
trajectory.addKeyPose(Eigen::AngleAxisf((float)0.6f, Eigen::Vector3f::UnitY()) * Trajectory::Transform::Identity());
84-
trajectory.addKeyPose(Eigen::AngleAxisf((float)1.57f, Eigen::Vector3f::UnitY()) * Trajectory::Transform::Identity());
65+
Trajectory::Transform prev;
66+
prev = trajectory.addKeyPose(Trajectory::Transform::Identity());
67+
prev = trajectory.addKeyPose(prev * Eigen::Translation3f(1.f, 0.f, 0.f));
68+
prev = trajectory.addKeyPose(prev * Eigen::Translation3f(2.f, 0.f, 0.f));
69+
prev = trajectory.addKeyPose(prev * Eigen::AngleAxisf((float)M_PI / 2.f, Eigen::Vector3f::UnitX()));
8570

86-
87-
88-
Eigen::Affine3f prev = trajectory(0.f);
71+
DeformationUtil dutil(ma, handles.begin(), handles.end(), trajectory(0.0));
8972

9073
// Create an OSG viewer to visualize incremental deformation.
9174
double duration = 10.f;
@@ -98,11 +81,9 @@ int main(int argc, char **argv) {
9881
if (t > 1.f)
9982
return false;
10083

101-
Trajectory::Transform transform = trajectory((float)t);
102-
applyTransformationToHandles(transform * prev.inverse(Eigen::Isometry), mesh, arap);
103-
prev = transform;
84+
dutil.updateConstraints(trajectory((float)t), arap);
10485

105-
arap.deform(40);
86+
arap.deform(20);
10687

10788
return true;
10889
});

inc/deform/deformation_util.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
This file is part of mesh-deform.
3+
4+
Copyright(C) 2016 Christoph Heindl
5+
All rights reserved.
6+
7+
This software may be modified and distributed under the terms
8+
of the BSD license.See the LICENSE file for details.
9+
*/
10+
11+
#ifndef DEFORM_DEFORMATION_UTIL_H
12+
#define DEFORM_DEFORMATION_UTIL_H
13+
14+
#include <deform/trajectory.h>
15+
#include <deform/arap.h>
16+
17+
namespace deform {
18+
19+
template<class MeshType>
20+
class DeformationUtil {
21+
public:
22+
23+
EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
24+
25+
typedef MeshType Mesh;
26+
27+
/** Floating point precision used in calculations. */
28+
typedef typename MeshType::Scalar Scalar;
29+
30+
/** Transformation matrix type. */
31+
typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform;
32+
33+
34+
template<class HandleIterator>
35+
DeformationUtil(const Mesh &mesh, HandleIterator handlesBegin, HandleIterator handlesEnd, const Transform &origin = Transform::Identity())
36+
:_origin(origin)
37+
{
38+
_originInv = origin.inverse(Eigen::Isometry);
39+
_handles.insert(_handles.begin(), handlesBegin, handlesEnd);
40+
_points.resize(3, _handles.size());
41+
42+
for (size_t i = 0; i < _handles.size(); ++i) {
43+
_points.col(i) = mesh.vertexLocation(_handles[i]);
44+
}
45+
46+
}
47+
48+
template<class ARAP>
49+
void updateConstraints(const Transform &t, ARAP &arap)
50+
{
51+
Transform tabs = _origin * t * _originInv;
52+
53+
for (size_t i = 0; i < _handles.size(); ++i) {
54+
arap.setConstraint(_handles[i], tabs * _points.col(i));
55+
}
56+
57+
}
58+
59+
private:
60+
std::vector<int> _handles;
61+
Eigen::Matrix<Scalar, 3, Eigen::Dynamic> _points;
62+
Transform _origin;
63+
Transform _originInv;
64+
};
65+
}
66+
67+
#endif

inc/deform/trajectory.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
#pragma warning (pop)
2929
#endif
3030

31-
#include <iostream>
32-
3331
namespace deform {
3432

3533
template<class PrecisionType>
@@ -54,9 +52,10 @@ namespace deform {
5452
:_dirty(false)
5553
{}
5654

57-
void addKeyPose(const Transform &transform) {
55+
Transform addKeyPose(const Transform &transform) {
5856
_transforms.push_back(transform);
5957
_dirty = true;
58+
return transform;
6059
}
6160

6261
Transform operator()(Scalar time) {

0 commit comments

Comments
 (0)