diff --git a/labo_ik/Armature.cpp b/labo_ik/Armature.cpp index d3afa80..4eb4392 100644 --- a/labo_ik/Armature.cpp +++ b/labo_ik/Armature.cpp @@ -6,63 +6,66 @@ using namespace gti320; // Constructor // -Link::Link(Link* _parent, const Vector3f& _eulerAng, const Vector3f& _trans) : - parent(_parent), eulerAng(_eulerAng), trans(_trans) -{ - if (parent != nullptr) - { +Link::Link(Link *_parent, const Vector3f &_eulerAng, const Vector3f &_trans) : + parent(_parent), eulerAng(_eulerAng), trans(_trans) { + if (parent != nullptr) { parent->enfants.push_back(this); } M.setIdentity(); } -void Link::forward() -{ - // TODO Create a rotation matrix from the Euler angles +void Link::forward() { + // Create a rotation matrix from the Euler angles // of the current link. - - // TODO Create a local 4D rigid transformation matrix from the + // Create a local 4D rigid transformation matrix from the // 3D rotation matrix and translation of the current link. + Matrix local; + local.setIdentity(); + local.block(0, 0, 3, 3) = makeRotation(eulerAng(0), eulerAng(1), eulerAng(2)); + local(0, 3) = trans(0); + local(1, 3) = trans(1); + local(2, 3) = trans(2); - // TODO Update the global transformation for the link using the + // Update the global transformation for the link using the // parent's rigid transformation matrix and the local transformation. // Hint : the parent matrix should be post-multiplied. // Hint : the root does not have a parent. You must consider this case. + if (isRoot()) { + M = local; + } else { + M = parent->M * local; + } - // TODO Update the transformation of child links + // Update the transformation of child links // by recursion. - + for (const auto &child: enfants) { + child->forward(); + } } -Armature::Armature() : links(), root(nullptr) -{ +Armature::Armature() : links(), root(nullptr) { } -Armature::~Armature() -{ - for (Link* l : links) - { +Armature::~Armature() { + for (Link *l: links) { delete l; } } -void Armature::updateKinematics() -{ +void Armature::updateKinematics() { assert(root != nullptr); root->forward(); } -void Armature::pack(Vector& theta) -{ +void Armature::pack(Vector &theta) { // TODO Collect the Euler angles of each link and put them // into the dense vector @a theta } -void Armature::unpack(const Vector& theta) -{ +void Armature::unpack(const Vector &theta) { const int numLinks = links.size(); assert(theta.size() == 3 * numLinks); diff --git a/labo_ik/CMakeLists.txt b/labo_ik/CMakeLists.txt index 3ed646b..12bfa72 100644 --- a/labo_ik/CMakeLists.txt +++ b/labo_ik/CMakeLists.txt @@ -27,7 +27,7 @@ set(HEADERS IKApplication.h IKGLCanvas.h LinkUI.h TargetUI.h Armature.h IKSolver set(SOURCE main.cpp IKApplication.cpp IKGLCanvas.cpp LinkUI.cpp TargetUI.cpp Armature.cpp IKSolver.cpp) add_executable(labo_ik ${SOURCE} ${HEADERS}) -target_link_libraries(labo_ik nanogui opengl32 ${NANOGUI_EXTRA_LIBS}) +target_link_libraries(labo_ik nanogui OpenGL ${NANOGUI_EXTRA_LIBS}) if(MSVC) set_property(TARGET labo_ik PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/labo_ik)