From 9be7af9e33c4e99e1a842ad32e5da23c4df89aa9 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Tue, 12 Jun 2018 11:50:08 +0200 Subject: [PATCH] Fix base_matrix update --- CGII/src/IKViewer.cpp | 71 ++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/CGII/src/IKViewer.cpp b/CGII/src/IKViewer.cpp index 5b5aa84..18633bd 100644 --- a/CGII/src/IKViewer.cpp +++ b/CGII/src/IKViewer.cpp @@ -22,8 +22,6 @@ IKViewer::IKViewer(DataStore *data) void IKViewer::endeffector_changed(Bone *b) { - std::cout << "endeffector changed!" << std::endl; - calculate_kinematic_chain(data->get_base(), data->get_endeffector()); post_redraw(); @@ -31,8 +29,6 @@ void IKViewer::endeffector_changed(Bone *b) void IKViewer::base_changed(Bone *b) { - std::cout << "base changed!" << std::endl; - calculate_kinematic_chain(data->get_base(), data->get_endeffector()); post_redraw(); @@ -53,55 +49,19 @@ int IKViewer::find_element(std::vector &v, Bone *element) void IKViewer::calculate_kinematic_chain(Bone *base, Bone *endeffector) { - std::cout << "calculate_kinematic_chain" << std::endl; - - if (base) - std::cout << "Base bone: " << base->get_name() << std::endl; - else - { - std::cout << "no base set" << std::endl; - std::cout << std::endl; - return; - } - - if (endeffector) - std::cout << "End bone: " << endeffector->get_name() << std::endl; - else - { - std::cout << "no endeffector set" << std::endl; - std::cout << std::endl; - return; - } - - std::cout << std::endl; - /*Task 3.1: Calculate kinematic chain*/ kinematic_chain.clear(); this->base = base; this->endeffector = endeffector; - // get list of bones in order of endeffector to base - std::vector endeffector_tree; - std::vector base_tree; - - // gather all bones from endeffector to root - Bone *current_bone = endeffector; - - while (1) - { - endeffector_tree.emplace_back(current_bone); - - // break if we reached base bone - if (current_bone->get_parent() == nullptr) - break; - - // set next bone in hierarchy - current_bone = current_bone->get_parent(); - } + if (!base) + return; // gather all bones from base to root - current_bone = base; + std::vector base_tree; + + Bone *current_bone = base; while (1) { @@ -137,6 +97,27 @@ void IKViewer::calculate_kinematic_chain(Bone *base, Bone *endeffector) current_base_matrix = current_base_matrix * transform->calculate_matrix(); } + if (!endeffector) + return; + + // get list of bones in order of endeffector to base + std::vector endeffector_tree; + + // gather all bones from endeffector to root + current_bone = endeffector; + + while (1) + { + endeffector_tree.emplace_back(current_bone); + + // break if we reached base bone + if (current_bone->get_parent() == nullptr) + break; + + // set next bone in hierarchy + current_bone = current_bone->get_parent(); + } + // add all transform from endeffector to common ancestor and to reverse base // state == 0 means, iterating through endeffector_tree