From a642d592de8ac30921cf2d290f9a713f0bf92f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz> Date: Sat, 18 May 2024 00:53:54 +0200 Subject: [PATCH] fix translation and rotation in export --- src/algo/include/algo/misc.hpp | 2 +- src/algo/src/misc.cpp | 32 ++++++++++++++++++++++++----- src/filein/src/rofiworld_loader.cpp | 7 ++----- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/algo/include/algo/misc.hpp b/src/algo/include/algo/misc.hpp index 1cb5819..a8fb3ca 100644 --- a/src/algo/include/algo/misc.hpp +++ b/src/algo/include/algo/misc.hpp @@ -24,7 +24,7 @@ bool AABB_intersect(const AABB &fst_aabb, const AABB &snd_aabb, const node_ptr & std::pair<std::size_t, std::size_t> get_pad_width_height_from_connector_count(const std::vector<connector_ptr> &connectors); -glm::vec3 convertToRoFICoordinates(const glm::vec3 &position); +glm::vec3 convertToRoFICoordinates(const glm::vec3 &position, const glm::vec3 &to_voxel_center); glm::mat4 convertToRoFICoordinates(const glm::mat4 &matrix); #endif \ No newline at end of file diff --git a/src/algo/src/misc.cpp b/src/algo/src/misc.cpp index 59a3910..439800e 100644 --- a/src/algo/src/misc.cpp +++ b/src/algo/src/misc.cpp @@ -109,16 +109,38 @@ std::pair<std::size_t, std::size_t> get_pad_width_height_from_connector_count(co return { static_cast<std::size_t>(max_x_pos) + 1, static_cast<std::size_t>(max_y_pos) + 1 }; } -glm::vec3 convertToRoFICoordinates(const glm::vec3 &position) +glm::vec3 convertToRoFICoordinates(const glm::vec3 &position, const glm::vec3 &to_voxel_center) { - return glm::vec3(position.z, position.x, position.y); + const auto voxel_position = position + to_voxel_center * 0.5f; + return glm::vec3(voxel_position.z, voxel_position.x, voxel_position.y); } glm::mat4 convertToRoFICoordinates(const glm::mat4 &matrix) { - auto m = glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f))) - * glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f))) - * matrix; + // E -> E' + + // auto m = // glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, 0.0f, -1.0f))) + // glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, -1.0f, 0.0f))) + // * glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(-1.0f, 0.0f, 0.0f))) + // // * matrix + // // * r_matrix; + // * corrected_matrix; + + const auto A_neg_X_local_correction_matrix = glm::mat4(0, 0, 1, 0, // col X + 0, -1, 0, 0, // col Y + 1, 0, 0, 0, // col Z + 0, 0, 0, 1 // col W + ); + + const auto corrected_component_matrix = matrix * A_neg_X_local_correction_matrix; + + const auto magic_matrix = glm::mat4(0, 1, 0, 0, // col X + 0, 0, 1, 0, // col Y + 1, 0, 0, 0, // col Z + 0, 0, 0, 1 // col W + ); + + auto m = magic_matrix * corrected_component_matrix; m[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); return m; diff --git a/src/filein/src/rofiworld_loader.cpp b/src/filein/src/rofiworld_loader.cpp index 29ebc7f..8184a4e 100644 --- a/src/filein/src/rofiworld_loader.cpp +++ b/src/filein/src/rofiworld_loader.cpp @@ -142,8 +142,7 @@ void export_spaceJoint(boost::json::array &spaceJoints_array, const rofiworld_pt void export_spaceJoint_point(boost::json::object &spaceJoint_object, const node_ptr node) { boost::json::array point_array; - const auto position = convertToRoFICoordinates(node->getPositionWorld()); - // const auto position = node->getPositionWorld(); + const auto position = convertToRoFICoordinates(node->getPositionWorld(), node->getRotationAxisZWorld()); for (int i = 0; i < 3; ++i) point_array.emplace_back(position[i]); @@ -167,9 +166,7 @@ void export_spaceJoint_joint(boost::json::object &spaceJoint_object, const node_ void export_spaceJoint_joint_matrix(boost::json::object &joint_object, const node_ptr node) { - auto component_coord_convert = glm::toMat4(glm::rotation(glm::vec3(0.0f, 0.0f, -1.0f), -node->getRotationAxisZWorld())); - // auto rotation_mat = convertToRoFICoordinates(component_coord_convert); - auto rotation_mat = component_coord_convert; + auto rotation_mat = convertToRoFICoordinates(node->getRotationMatWorld()); float epsilon = 0.00001f; bool is_identity = true; -- GitLab