Implement task 1 matrices
This commit is contained in:
parent
0afc5f5280
commit
52db577e51
50
.vscode/settings.json
vendored
50
.vscode/settings.json
vendored
|
@ -7,6 +7,52 @@
|
||||||
"array": "cpp",
|
"array": "cpp",
|
||||||
"initializer_list": "cpp",
|
"initializer_list": "cpp",
|
||||||
"string_view": "cpp",
|
"string_view": "cpp",
|
||||||
"valarray": "cpp"
|
"valarray": "cpp",
|
||||||
}
|
"cctype": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"csignal": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"hash_map": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"future": "cpp",
|
||||||
|
"iomanip": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"variant": "cpp",
|
||||||
|
"algorithm": "cpp"
|
||||||
|
},
|
||||||
|
"editor.formatOnSave": true
|
||||||
}
|
}
|
BIN
2-intro.pdf
Normal file
BIN
2-intro.pdf
Normal file
Binary file not shown.
|
@ -9,11 +9,19 @@
|
||||||
|
|
||||||
#include "math_helper.h"
|
#include "math_helper.h"
|
||||||
|
|
||||||
|
float calc_angle(Vec3 dir_vec, Vec3 axis)
|
||||||
|
{
|
||||||
|
float dot_result = dot(dir_vec, axis);
|
||||||
|
|
||||||
|
float length_v1 = length(dir_vec);
|
||||||
|
float length_v2 = length(axis);
|
||||||
|
|
||||||
|
return acos(dot_result / (length_v1 * length_v2));
|
||||||
|
}
|
||||||
|
|
||||||
Bone::Bone()
|
Bone::Bone()
|
||||||
: parent(nullptr), length(0.0f), direction_in_world_space(0.0, 0.0, 0.0), translationTransforms(0)
|
: parent(nullptr), length(0.0f), direction_in_world_space(0.0, 0.0, 0.0), translationTransforms(0)
|
||||||
{
|
{
|
||||||
start_point = Vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
end_point = Vec3(0.0f, 0.0f, 0.0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bone::~Bone()
|
Bone::~Bone()
|
||||||
|
@ -33,24 +41,63 @@ void Bone::calculate_matrices()
|
||||||
{
|
{
|
||||||
orientationTransformGlobalToLocal.identity();
|
orientationTransformGlobalToLocal.identity();
|
||||||
std::for_each(orientation.begin(), orientation.end(), [&](AtomicTransform *t) {
|
std::for_each(orientation.begin(), orientation.end(), [&](AtomicTransform *t) {
|
||||||
|
std::cout << "atomic transform " << t->get_name() << ": " << t->get_value() << std::endl;
|
||||||
|
|
||||||
orientationTransformGlobalToLocal = orientationTransformGlobalToLocal * t->calculate_matrix();
|
orientationTransformGlobalToLocal = orientationTransformGlobalToLocal * t->calculate_matrix();
|
||||||
});
|
});
|
||||||
orientationTransformLocalToGlobal = cgv::math::inv(orientationTransformGlobalToLocal);
|
orientationTransformLocalToGlobal = cgv::math::inv(orientationTransformGlobalToLocal);
|
||||||
|
|
||||||
if (parent != nullptr)
|
|
||||||
start_point = parent->end_point;
|
|
||||||
|
|
||||||
end_point = start_point + length * direction_in_world_space;
|
|
||||||
|
|
||||||
std::cout << name << " start at ("
|
|
||||||
<< start_point.x() << ", "
|
|
||||||
<< start_point.y() << ", "
|
|
||||||
<< start_point.z() << "), end at ("
|
|
||||||
<< end_point.x() << ", "
|
|
||||||
<< end_point.y() << ", "
|
|
||||||
<< end_point.z() << ")" << std::endl;
|
|
||||||
|
|
||||||
/*Task 2.1: Implement matrix calculation */
|
/*Task 2.1: Implement matrix calculation */
|
||||||
|
Mat4 matrix;
|
||||||
|
matrix.identity();
|
||||||
|
|
||||||
|
Vec3 vector = direction_in_world_space * length;
|
||||||
|
|
||||||
|
translationTransformCurrentJointToNext = translate(vector);
|
||||||
|
orientationTransformPrevJointToCurrent = matrix;
|
||||||
|
|
||||||
|
/*
|
||||||
|
translationTransformCurrentJointToNext = translate(0.0f, 0.0f, length);
|
||||||
|
|
||||||
|
if (parent == NULL)
|
||||||
|
{
|
||||||
|
if (direction_in_world_space.x() == 0.0f &&
|
||||||
|
direction_in_world_space.y() == 0.0f &&
|
||||||
|
direction_in_world_space.z() == 0.0f) {
|
||||||
|
orientationTransformPrevJointToCurrent = rotate(Vec3(0.0f, 0.0f, 1.0f), 0.0f);
|
||||||
|
} else {
|
||||||
|
std::cout << direction_in_world_space.x() << ", "
|
||||||
|
<< direction_in_world_space.y() << ", "
|
||||||
|
<< direction_in_world_space.z() << std::endl;
|
||||||
|
|
||||||
|
float z_angle = calc_angle(direction_in_world_space, Vec3(0.0f, 0.0f, 1.0f));
|
||||||
|
float y_angle = calc_angle(direction_in_world_space, Vec3(0.0f, 1.0f, 0.0f));
|
||||||
|
float x_angle = calc_angle(direction_in_world_space, Vec3(1.0f, 0.0f, 0.0f));
|
||||||
|
|
||||||
|
std::cout << "z_angle " << z_angle << std::endl;
|
||||||
|
std::cout << "y_angle " << y_angle << std::endl;
|
||||||
|
std::cout << "x_angle " << x_angle << std::endl;
|
||||||
|
|
||||||
|
Mat4 z_mat = rotate(Vec3(0.0f, 0.0f, 1.0f), z_angle);
|
||||||
|
Mat4 y_mat = rotate(Vec3(0.0f, 1.0f, 0.0f), y_angle);
|
||||||
|
Mat4 x_mat = rotate(Vec3(1.0f, 0.0f, 0.0f), x_angle);
|
||||||
|
|
||||||
|
Mat4 result = z_mat * y_mat * x_mat;
|
||||||
|
|
||||||
|
orientationTransformPrevJointToCurrent = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Mat4 parent_orientation = parent->get_orientation_transform_prev_joint_to_current();
|
||||||
|
|
||||||
|
float angle = calc_angle(direction_in_world_space, parent->get_direction_in_world_space());
|
||||||
|
|
||||||
|
Mat4 rot = rotate(Vec3(1.0f, 1.0f, 1.0f), angle);
|
||||||
|
|
||||||
|
orientationTransformPrevJointToCurrent = rot;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/*Task 4.6: Implement matrix calculation */
|
/*Task 4.6: Implement matrix calculation */
|
||||||
}
|
}
|
||||||
|
@ -58,16 +105,21 @@ void Bone::calculate_matrices()
|
||||||
Mat4 Bone::calculate_transform_prev_to_current_with_dofs()
|
Mat4 Bone::calculate_transform_prev_to_current_with_dofs()
|
||||||
{
|
{
|
||||||
//Task 2.1: Implement matrix calculation
|
//Task 2.1: Implement matrix calculation
|
||||||
Mat4 t;
|
Mat4 dofs;
|
||||||
t.identity();
|
dofs.identity();
|
||||||
|
|
||||||
|
std::for_each(orientation.begin(), orientation.end(), [&](AtomicTransform *t) {
|
||||||
|
dofs = dofs * t->calculate_matrix();
|
||||||
|
});
|
||||||
|
|
||||||
|
Mat4 t = translationTransformCurrentJointToNext * orientationTransformPrevJointToCurrent * dofs;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mat4 Bone::calculate_transform_prev_to_current_without_dofs()
|
Mat4 Bone::calculate_transform_prev_to_current_without_dofs()
|
||||||
{
|
{
|
||||||
//Task 2.1: Implement matrix calculation
|
//Task 2.1: Implement matrix calculation
|
||||||
Mat4 t;
|
Mat4 t = translationTransformCurrentJointToNext * orientationTransformPrevJointToCurrent;
|
||||||
t.identity();
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,4 +171,4 @@ const Mat4 &Bone::get_translation_transform_current_joint_to_next() const { retu
|
||||||
const Mat4 &Bone::get_orientation_transform_prev_joint_to_current() const { return orientationTransformPrevJointToCurrent; }
|
const Mat4 &Bone::get_orientation_transform_prev_joint_to_current() const { return orientationTransformPrevJointToCurrent; }
|
||||||
|
|
||||||
Vec4 Bone::get_bone_local_root_position() const { return Vec4(0, 0, 0, 1); }
|
Vec4 Bone::get_bone_local_root_position() const { return Vec4(0, 0, 0, 1); }
|
||||||
Vec4 Bone::get_bone_local_tip_position() const { return translationTransformCurrentJointToNext * Vec4(0, 0, 0, 1); }
|
Vec4 Bone::get_bone_local_tip_position() const { return translationTransformCurrentJointToNext * Vec4(0, 0, 0, 1); }
|
||||||
|
|
|
@ -97,10 +97,6 @@ class Bone
|
||||||
//Available after implementing task 4.6.
|
//Available after implementing task 4.6.
|
||||||
const Mat4 &get_binding_pose_matrix() const;
|
const Mat4 &get_binding_pose_matrix() const;
|
||||||
|
|
||||||
// Testing area
|
|
||||||
Vec3 start_point; // same as parent end point
|
|
||||||
Vec3 end_point; // start_point + (length * direction_in_world_space)
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//The following attributes are read from the ASF file
|
//The following attributes are read from the ASF file
|
||||||
std::deque<std::shared_ptr<AtomicTransform>> dofs; //Degrees of freedom for the bone
|
std::deque<std::shared_ptr<AtomicTransform>> dofs; //Degrees of freedom for the bone
|
||||||
|
|
|
@ -31,13 +31,19 @@ SkeletonViewer::SkeletonViewer(DataStore *data)
|
||||||
void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_parent_local, context &c)
|
void SkeletonViewer::draw_skeleton_subtree(Bone *node, const Mat4 &global_to_parent_local, context &c)
|
||||||
{
|
{
|
||||||
//Task: Draw skeleton
|
//Task: Draw skeleton
|
||||||
c.tesselate_arrow(node->start_point, node->end_point);
|
Mat4 local_transform = node->calculate_transform_prev_to_current_with_dofs()
|
||||||
|
* global_to_parent_local;
|
||||||
|
|
||||||
Mat4 transform;
|
Vec4 zero = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
Vec4 p1 = global_to_parent_local * zero;
|
||||||
|
Vec4 p2 = local_transform * zero;
|
||||||
|
|
||||||
|
c.tesselate_arrow(Vec3(p1.x(), p1.y(), p1.z()), Vec3(p2.x(), p2.y(), p2.z()));
|
||||||
|
|
||||||
for (int i = 0; i < node->childCount(); i++)
|
for (int i = 0; i < node->childCount(); i++)
|
||||||
{
|
{
|
||||||
draw_skeleton_subtree(node->child_at(i), transform, c);
|
draw_skeleton_subtree(node->child_at(i), local_transform, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,6 +64,8 @@ void SkeletonViewer::stop_animation()
|
||||||
|
|
||||||
void SkeletonViewer::skeleton_changed(std::shared_ptr<Skeleton> s)
|
void SkeletonViewer::skeleton_changed(std::shared_ptr<Skeleton> s)
|
||||||
{
|
{
|
||||||
|
std::cout << "skeleton changed" << std::endl;
|
||||||
|
|
||||||
// This function is called whenever the according signal of the
|
// This function is called whenever the according signal of the
|
||||||
// data store has been called.
|
// data store has been called.
|
||||||
|
|
||||||
|
@ -96,6 +104,8 @@ void SkeletonViewer::recursive_connect_signals(Bone *b)
|
||||||
|
|
||||||
void SkeletonViewer::dof_changed(double)
|
void SkeletonViewer::dof_changed(double)
|
||||||
{
|
{
|
||||||
|
std::cout << "dof changed" << std::endl;
|
||||||
|
|
||||||
if (!data->dof_changed_by_ik)
|
if (!data->dof_changed_by_ik)
|
||||||
data->set_endeffector(nullptr);
|
data->set_endeffector(nullptr);
|
||||||
|
|
||||||
|
|
|
@ -59,11 +59,11 @@ macro(_cgv_add_core_library target_name)
|
||||||
|
|
||||||
# Append this element to the list of targets
|
# Append this element to the list of targets
|
||||||
set(CGV_LIB_TARGETS ${CGV_LIB_TARGETS} ${target_name} PARENT_SCOPE)
|
set(CGV_LIB_TARGETS ${CGV_LIB_TARGETS} ${target_name} PARENT_SCOPE)
|
||||||
|
|
||||||
# Set a source folder for VisualStudio
|
# Set a source folder for VisualStudio
|
||||||
set_target_properties(${target_name} PROPERTIES FOLDER "${FOLDER_NAME_CGV}")
|
set_target_properties(${target_name} PROPERTIES FOLDER "${FOLDER_NAME_CGV}")
|
||||||
|
|
||||||
_cgv_set_cxx_standard(${target_name})
|
_cgv_set_cxx_standard(${target_name})
|
||||||
|
|
||||||
# Set definitions for shared and static libraries.
|
# Set definitions for shared and static libraries.
|
||||||
string(TOUPPER ${target_name} TARGET_UPPER)
|
string(TOUPPER ${target_name} TARGET_UPPER)
|
||||||
|
@ -72,7 +72,7 @@ macro(_cgv_add_core_library target_name)
|
||||||
COMMON UNICODE _UNICODE
|
COMMON UNICODE _UNICODE
|
||||||
SHARED "${TARGET_UPPER}_EXPORTS" ${COMPONENT_SHARED_DEFINITIONS}
|
SHARED "${TARGET_UPPER}_EXPORTS" ${COMPONENT_SHARED_DEFINITIONS}
|
||||||
STATIC "${TARGET_UPPER}_FORCE_STATIC;CGV_FORCE_STATIC" ${COMPONENT_STATIC_DEFINITIONS})
|
STATIC "${TARGET_UPPER}_FORCE_STATIC;CGV_FORCE_STATIC" ${COMPONENT_STATIC_DEFINITIONS})
|
||||||
|
|
||||||
# Add definitions to use unicode
|
# Add definitions to use unicode
|
||||||
# FIXME: This might be a hack
|
# FIXME: This might be a hack
|
||||||
add_definitions("-DUNICODE -D_UNICODE")
|
add_definitions("-DUNICODE -D_UNICODE")
|
||||||
|
@ -102,21 +102,21 @@ macro(build_core_components_finish)
|
||||||
# HACK: Since CMake has no way to enumerate targets they are written
|
# HACK: Since CMake has no way to enumerate targets they are written
|
||||||
# in a cmake file which will also be installed
|
# in a cmake file which will also be installed
|
||||||
SET(LOCAL_EXPORTS_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}/${INSTALL_CMAKE_PATH}")
|
SET(LOCAL_EXPORTS_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}/${INSTALL_CMAKE_PATH}")
|
||||||
|
|
||||||
set(CGV_TARGETS_DEFINITIONS "")
|
set(CGV_TARGETS_DEFINITIONS "")
|
||||||
foreach(target ${CGV_LIB_TARGETS})
|
foreach(target ${CGV_LIB_TARGETS})
|
||||||
get_target_property(SHARED_DEF ${target} _SHARED_DEFINITIONS)
|
get_target_property(SHARED_DEF ${target} _SHARED_DEFINITIONS)
|
||||||
get_target_property(STATIC_DEF ${target} _STATIC_DEFINITIONS)
|
get_target_property(STATIC_DEF ${target} _STATIC_DEFINITIONS)
|
||||||
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_SHARED_DEFINITIONS \"${SHARED_DEF}\")")
|
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_SHARED_DEFINITIONS \"${SHARED_DEF}\")")
|
||||||
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_STATIC_DEFINITIONS \"${STATIC_DEF}\")")
|
set(CGV_TARGETS_DEFINITIONS "${CGV_TARGETS_DEFINITIONS}\nset(${target}_STATIC_DEFINITIONS \"${STATIC_DEF}\")")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
configure_file("${CGV_BASE}/cmake/${CGV_TARGETS_CONFIG_NAME}.in"
|
configure_file("${CGV_BASE}/cmake/${CGV_TARGETS_CONFIG_NAME}.in"
|
||||||
"${LOCAL_EXPORTS_DIR}/${CGV_TARGETS_CONFIG_NAME}"
|
"${LOCAL_EXPORTS_DIR}/${CGV_TARGETS_CONFIG_NAME}"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
# file(WRITE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
|
# file(WRITE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
|
||||||
# "SET(CGV_TARGETS ${CGV_LIB_TARGETS})")
|
# "SET(CGV_TARGETS ${CGV_LIB_TARGETS})")
|
||||||
# install(FILES "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
|
# install(FILES "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_INDEX_NAME}"
|
||||||
|
@ -124,7 +124,7 @@ macro(build_core_components_finish)
|
||||||
|
|
||||||
export(TARGETS ${CGV_LIB_TARGETS} FILE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_NAME}")
|
export(TARGETS ${CGV_LIB_TARGETS} FILE "${LOCAL_EXPORTS_DIR}/${CGV_EXPORTS_NAME}")
|
||||||
|
|
||||||
# Export all targets
|
# Export all targets
|
||||||
install(EXPORT ${CGV_EXPORTS_ID} DESTINATION "${INSTALL_BASE}/${INSTALL_CMAKE_PATH}")
|
install(EXPORT ${CGV_EXPORTS_ID} DESTINATION "${INSTALL_BASE}/${INSTALL_CMAKE_PATH}")
|
||||||
|
|
||||||
install(FILES ${CGV_BASE}/cmake/base.cmake
|
install(FILES ${CGV_BASE}/cmake/base.cmake
|
||||||
|
@ -142,19 +142,19 @@ macro(build_core_components_finish)
|
||||||
${CGV_BASE}/cmake/PkgBinConfig.cmake.in
|
${CGV_BASE}/cmake/PkgBinConfig.cmake.in
|
||||||
${CGV_BASE}/cmake/PkgLibConfig.cmake.in
|
${CGV_BASE}/cmake/PkgLibConfig.cmake.in
|
||||||
DESTINATION "${INSTALL_BASE}/cmake")
|
DESTINATION "${INSTALL_BASE}/cmake")
|
||||||
|
|
||||||
install(FILES ${CGV_BASE}/cmake/launcher.sh.in
|
install(FILES ${CGV_BASE}/cmake/launcher.sh.in
|
||||||
DESTINATION "${INSTALL_BASE}/${OS_PREFIX}/cmake")
|
DESTINATION "${INSTALL_BASE}/${OS_PREFIX}/cmake")
|
||||||
|
|
||||||
# TODO: Comment this
|
# TODO: Comment this
|
||||||
set(LOCAL_BUILD_ANNOUNCED TRUE)
|
set(LOCAL_BUILD_ANNOUNCED TRUE)
|
||||||
set(LOCAL_BUILD_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}")
|
set(LOCAL_BUILD_DIR "${CMAKE_BINARY_DIR}/${BUILD_BASE}")
|
||||||
|
|
||||||
file(WRITE "${CGV_BASE}/cmake/local_build_dir.cmake"
|
file(WRITE "${CGV_BASE}/cmake/local_build_dir.cmake"
|
||||||
"set(LOCAL_BUILD_DIR \"${LOCAL_BUILD_DIR}\")")
|
"set(LOCAL_BUILD_DIR \"${LOCAL_BUILD_DIR}\")")
|
||||||
|
|
||||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
|
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
|
||||||
"${CGV_BASE}/cmake/local_build_dir.cmake")
|
"${CGV_BASE}/cmake/local_build_dir.cmake")
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue