diff --git a/CGII/build/cmake/CMakeLists.txt b/CGII/build/cmake/CMakeLists.txt index 92959fa..e90fb69 100644 --- a/CGII/build/cmake/CMakeLists.txt +++ b/CGII/build/cmake/CMakeLists.txt @@ -30,10 +30,11 @@ cgv_add_module(CGII ../../src/IHasBoundingBox.cpp ../../src/IKViewer.cpp ../../src/Mesh.cpp - ../../src/Skeleton.cpp + ../../src/Skeleton.cpp ../../src/SkeletonViewer.cpp ../../src/SkinnedMeshViewer.cpp - ../../src/main.cpp) + ../../src/main.cpp + ../../src/debughelpers.cpp) # Set include directories include_directories( @@ -46,7 +47,7 @@ target_link_libraries(CGII ${cgv_LIBRARIES} ${cgv_gl_LIBRARIES}) # Set the viewer working directory to point at the # the source files - + # Add a viewer cgv_add_viewer(launch-exercise1 diff --git a/CGII/src/IKViewer.cpp b/CGII/src/IKViewer.cpp index bef62a9..05d0ef7 100644 --- a/CGII/src/IKViewer.cpp +++ b/CGII/src/IKViewer.cpp @@ -5,6 +5,7 @@ #include "IKViewer.h" #include "math_helper.h" +#include "debughelpers.h" #include @@ -79,12 +80,26 @@ void IKViewer::calculate_kinematic_chain(Bone *base, Bone *endeffector) current_bone = current_bone->get_parent(); } + kinematic_chain.clear(); + for (Bone *bone : bones) { // TODO: calculate and add transforms to queue - std::shared_ptr transform; + Transform *tmp = new StaticTransform(bone->calculate_transform_prev_to_current_with_dofs()); + std::shared_ptr transform = std::shared_ptr(tmp); kinematic_chain.emplace_front(transform); } + + current_endeffector_matrix.identity(); + + for (auto &transform : kinematic_chain) + { + current_endeffector_matrix = current_endeffector_matrix * transform->calculate_matrix(); + } + + target_position = current_endeffector_matrix * endeffector->get_bone_local_tip_position(); + + print_vec3(target_position); } void IKViewer::optimize() diff --git a/CGII/src/SkeletonViewer.cpp b/CGII/src/SkeletonViewer.cpp index 17816db..2077fb7 100644 --- a/CGII/src/SkeletonViewer.cpp +++ b/CGII/src/SkeletonViewer.cpp @@ -1,5 +1,5 @@ -// This source code is property of the Computer Graphics and Visualization -// chair of the TU Dresden. Do not distribute! +// This source code is property of the Computer Graphics and Visualization +// chair of the TU Dresden. Do not distribute! // Copyright (C) CGV TU Dresden - All Rights Reserved // #include "SkeletonViewer.h" @@ -12,42 +12,47 @@ #include #include "math_helper.h" +#include "debughelpers.h" using namespace cgv::utils; cgv::render::shader_program Mesh::prog; // The constructor of this class -SkeletonViewer::SkeletonViewer(DataStore* data) - : node("Skeleton Viewer"), data(data) - , animation(nullptr), animationTime(0) -{ +SkeletonViewer::SkeletonViewer(DataStore *data) + : node("Skeleton Viewer"), data(data), animation(nullptr), animationTime(0) +{ connect(data->skeleton_changed, this, &SkeletonViewer::skeleton_changed); connect(get_animation_trigger().shoot, this, &SkeletonViewer::timer_event); } //draws a part of a skeleton, represented by the given root node -void SkeletonViewer::draw_skeleton_subtree(Bone* node, const Mat4& global_to_parent_local, context& c, int level, bool arrows, bool indicators) +void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_parent_local, context &c, int level, bool arrows, bool indicators) { auto global_to_current_local = global_to_parent_local * node->calculate_transform_prev_to_current_with_dofs(); auto my_root_position = global_to_current_local * node->get_bone_local_root_position(); auto my_tip_position = global_to_current_local * node->get_bone_local_tip_position(); + + std::cout << "bone: " << node->get_name() << std::endl; + print_vec3(my_root_position); + print_vec3(my_tip_position); + if (arrows) { const GLubyte colors[][3] = - { - { 27,158,119 }, - { 217,95,2 }, - { 117,112,179 }, - { 231,41,138 }, - { 102,166,30 }, - { 230,171,2 }, - { 166,118,29 }, - }; + { + {27, 158, 119}, + {217, 95, 2}, + {117, 112, 179}, + {231, 41, 138}, + {102, 166, 30}, + {230, 171, 2}, + {166, 118, 29}, + }; glColor3ubv(colors[level % 7]); c.tesselate_arrow(cgv::math::fvec(my_root_position.x(), my_root_position.y(), my_root_position.z()), - cgv::math::fvec(my_tip_position.x(), my_tip_position.y(), my_tip_position.z()), 0.1, 2.0, 0.5); + cgv::math::fvec(my_tip_position.x(), my_tip_position.y(), my_tip_position.z()), 0.1, 2.0, 0.5); } Mat4 dof_matrix = global_to_parent_local * node->calculate_transform_prev_to_current_without_dofs(); float indicatorSize = (data->get_skeleton()->getMax() - data->get_skeleton()->getMin()).length() * 0.05f; @@ -91,7 +96,7 @@ void SkeletonViewer::timer_event(double, double dt) void SkeletonViewer::start_animation() { playing = true; } void SkeletonViewer::stop_animation() { playing = false; } -void SkeletonViewer::skeleton_changed(std::shared_ptr s) +void SkeletonViewer::skeleton_changed(std::shared_ptr s) { // This function is called whenever the according signal of the // data store has been called. @@ -100,9 +105,10 @@ void SkeletonViewer::skeleton_changed(std::shared_ptr s) generate_tree_view_nodes(); //Fit view to skeleton - std::vector view_ptrs; + std::vector view_ptrs; cgv::base::find_interface(get_node(), view_ptrs); - if (view_ptrs.empty()) { + if (view_ptrs.empty()) + { // If there is no view, we cannot update it cgv::gui::message("could not find a view to adjust!!"); } @@ -112,15 +118,15 @@ void SkeletonViewer::skeleton_changed(std::shared_ptr s) view_ptrs[0]->set_focus(center.x(), center.y(), center.z()); // Set the scene's size at the focus point view_ptrs[0]->set_y_extent_at_focus(s->getMax().y() - s->getMin().y()); - } + } - //connect signals - recursive_connect_signals(s->get_root()); + //connect signals + recursive_connect_signals(s->get_root()); post_redraw(); } -void SkeletonViewer::recursive_connect_signals(Bone* b) +void SkeletonViewer::recursive_connect_signals(Bone *b) { for (int i = 0; i < b->dof_count(); ++i) connect(b->get_dof(i)->changed_signal, this, &SkeletonViewer::dof_changed); @@ -146,7 +152,7 @@ void SkeletonViewer::generate_tree_view_nodes() generate_tree_view_nodes(tree_view, data->get_skeleton()->get_root()); } -void SkeletonViewer::generate_tree_view_nodes(gui_group_ptr parent, Bone* bone) +void SkeletonViewer::generate_tree_view_nodes(gui_group_ptr parent, Bone *bone) { if (bone->childCount() == 0) { @@ -166,7 +172,7 @@ void SkeletonViewer::generate_tree_view_nodes(gui_group_ptr parent, Bone* bone) void SkeletonViewer::start_choose_base() { - Bone* b = data->get_endeffector(); + Bone *b = data->get_endeffector(); data->set_endeffector(nullptr); data->set_base(b); } @@ -175,9 +181,9 @@ void SkeletonViewer::tree_selection_changed(base_ptr p, bool select) { bone_group->remove_all_children(); - if (select) + if (select) { - Bone* bone = gui_to_bone.at(p); + Bone *bone = gui_to_bone.at(p); generate_bone_gui(bone); data->set_endeffector(bone); } @@ -237,7 +243,7 @@ void SkeletonViewer::load_pinocchio() std::string filename = cgv::gui::file_open_dialog("Open", "Pinocchio skeleton (*.out):*.out"); if (!filename.empty()) { - data->get_skeleton()->read_pinocchio_file(filename); + data->get_skeleton()->read_pinocchio_file(filename); skeleton_changed(data->get_skeleton()); } } @@ -275,13 +281,13 @@ void SkeletonViewer::load_animation() // Create the gui elements void SkeletonViewer::create_gui() -{ +{ //Bone tree view - parent_group->multi_set("layout='table';rows=3;spacings='normal';"); + parent_group->multi_set("layout='table';rows=3;spacings='normal';"); - tree_view = add_group("", "tree_group", "h=300;column_heading_0='Bones';column_width_0=-1", "f"); + tree_view = add_group("", "tree_group", "h=300;column_heading_0='Bones';column_width_0=-1", "f"); bone_group = add_group("", "align_group", "h=150", "f"); - + auto dock_group = add_group("", "dockable_group", "", "fF"); connect(tree_view->on_selection_change, this, &SkeletonViewer::tree_selection_changed); @@ -292,28 +298,28 @@ void SkeletonViewer::create_gui() auto gui_group = dock_group->add_group("", "align_group", "", "f"); connect_copy(gui_group->add_button("Load ASF skeleton", "", "\n")->click, - rebind(this, &SkeletonViewer::load_skeleton)); + rebind(this, &SkeletonViewer::load_skeleton)); connect_copy(gui_group->add_button("Load Animation", "", "\n")->click, - rebind(this, &SkeletonViewer::load_animation)); + rebind(this, &SkeletonViewer::load_animation)); connect_copy(gui_group->add_button("Start Animation", "", "\n")->click, - rebind(this, &SkeletonViewer::start_animation)); + rebind(this, &SkeletonViewer::start_animation)); connect_copy(gui_group->add_button("Stop Animation", "", "\n")->click, - rebind(this, &SkeletonViewer::stop_animation)); + rebind(this, &SkeletonViewer::stop_animation)); connect_copy(gui_group->add_button("Choose IK Base", "", "\n")->click, - rebind(this, &SkeletonViewer::start_choose_base)); - + rebind(this, &SkeletonViewer::start_choose_base)); + connect_copy(gui_group->add_button("Write Pinocchio skeleton", "", "\n")->click, - rebind(this, &SkeletonViewer::write_pinocchio)); + rebind(this, &SkeletonViewer::write_pinocchio)); connect_copy(gui_group->add_button("Load Pinocchio skeleton", "", "\n")->click, - rebind(this, &SkeletonViewer::load_pinocchio)); + rebind(this, &SkeletonViewer::load_pinocchio)); } -void SkeletonViewer::generate_bone_gui(Bone* bone) +void SkeletonViewer::generate_bone_gui(Bone *bone) { // Add bone-specific gui elements to bone_group. // Use the layout "\n" to specify vertical alignment @@ -329,7 +335,7 @@ void SkeletonViewer::generate_bone_gui(Bone* bone) } } -void SkeletonViewer::draw(context& c) +void SkeletonViewer::draw(context &c) { glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); diff --git a/CGII/src/debughelpers.cpp b/CGII/src/debughelpers.cpp new file mode 100644 index 0000000..9662c00 --- /dev/null +++ b/CGII/src/debughelpers.cpp @@ -0,0 +1,23 @@ +#include "debughelpers.h" + +#include + +void print_vec3(const Vec3 &v) +{ + std::cout << "(" << v.x() << ", " << v.y() << ", " << v.z() << ")" << std::endl; +} + +void print_vec3(const Vec4 &v) +{ + print_vec3(into_vec3(v)); +} + +Vec3 into_vec3(const Vec4 &v) +{ + return Vec3(v.x(), v.y(), v.z()); +} + +Vec4 into_vec4(const Vec3 &v) +{ + return Vec4(v.x(), v.y(), v.z(), 1.0f); +} \ No newline at end of file diff --git a/CGII/src/debughelpers.h b/CGII/src/debughelpers.h new file mode 100644 index 0000000..836285e --- /dev/null +++ b/CGII/src/debughelpers.h @@ -0,0 +1,11 @@ +#pragma once + +#include "math_helper.h" + +void print_vec3(const Vec3 &v); + +void print_vec3(const Vec4 &v); + +Vec3 into_vec3(const Vec4 &v); + +Vec4 into_vec4(const Vec3 &v); \ No newline at end of file diff --git a/CGII/src/math_helper.h b/CGII/src/math_helper.h index bed3e5d..84e4cbf 100644 --- a/CGII/src/math_helper.h +++ b/CGII/src/math_helper.h @@ -1,5 +1,5 @@ -// This source code is property of the Computer Graphics and Visualization -// chair of the TU Dresden. Do not distribute! +// This source code is property of the Computer Graphics and Visualization +// chair of the TU Dresden. Do not distribute! // Copyright (C) CGV TU Dresden - All Rights Reserved // #pragma once @@ -21,7 +21,7 @@ const cgv::math::fmat rotate(const cgv::math::fvec axis, T angle_ ///creates a 4x4 translation matrix template -const cgv::math::fmat translate(const T&x, const T &y, const T&z) +const cgv::math::fmat translate(const T &x, const T &y, const T &z) { cgv::math::fmat m; m.identity();