From 9f60963102f991a8a099f9418b6b986bfbf8056d Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Thu, 13 Jul 2023 23:31:07 -0400 Subject: [PATCH] Progress towards mental freedom --- Editor/resources/Models/Camera.gltf | 46 +++++++-------- Editor/src/Windows/EditorInterface.cpp | 62 +++++++++++++-------- Nuake/src/Core/Maths.cpp | 12 ++++ Nuake/src/Core/Maths.h | 1 + Nuake/src/Scene/Systems/TransformSystem.cpp | 11 ++-- 5 files changed, 82 insertions(+), 50 deletions(-) diff --git a/Editor/resources/Models/Camera.gltf b/Editor/resources/Models/Camera.gltf index b8fbf7ed..b3228a9a 100644 --- a/Editor/resources/Models/Camera.gltf +++ b/Editor/resources/Models/Camera.gltf @@ -22,17 +22,17 @@ 0, 0.7071068286895752 ], - "scale" : [ - 0.21287661790847778, - 0.14901362359523773, - 0.14901362359523773 + "translation" : [ + 0, + 0, + 0.06328082829713821 ] } ], "materials" : [ { "doubleSided" : true, - "name" : "Material.001", + "name" : "Material.002", "pbrMetallicRoughness" : { "baseColorFactor" : [ 0.800000011920929, @@ -47,7 +47,7 @@ ], "meshes" : [ { - "name" : "Cube.001", + "name" : "Cube.002", "primitives" : [ { "attributes" : { @@ -65,29 +65,29 @@ { "bufferView" : 0, "componentType" : 5126, - "count" : 204, + "count" : 261, "max" : [ - 0.2293514609336853, - 0.25309160351753235, - 0.19999998807907104 + 0.13640516996383667, + 0.2530915439128876, + 0.43141499161720276 ], "min" : [ - -0.3706485629081726, - -0.19999998807907104, - -0.19999998807907104 + -0.14359483122825623, + -0.19999995827674866, + -0.4257279336452484 ], "type" : "VEC3" }, { "bufferView" : 1, "componentType" : 5126, - "count" : 204, + "count" : 261, "type" : "VEC3" }, { "bufferView" : 2, "componentType" : 5126, - "count" : 204, + "count" : 261, "type" : "VEC2" }, { @@ -100,29 +100,29 @@ "bufferViews" : [ { "buffer" : 0, - "byteLength" : 2448, + "byteLength" : 3132, "byteOffset" : 0 }, { "buffer" : 0, - "byteLength" : 2448, - "byteOffset" : 2448 + "byteLength" : 3132, + "byteOffset" : 3132 }, { "buffer" : 0, - "byteLength" : 1632, - "byteOffset" : 4896 + "byteLength" : 2088, + "byteOffset" : 6264 }, { "buffer" : 0, "byteLength" : 540, - "byteOffset" : 6528 + "byteOffset" : 8352 } ], "buffers" : [ { - "byteLength" : 7068, - "uri" : "data:application/octet-stream;base64,gL4uvlzOvj1czr69gL4uvlzOvj1czr69gL4uvlzOvj1czr69gL4uvlzOvj1czr69gL4uvlzOvj1czr69gL4uvljOvr1czr69gL4uvljOvr1czr69gL4uvljOvr1czr69gL4uvljOvr1czr69gL4uvljOvr1czr69gL4uvljOvr1czr69gL4uvlzOvj1czr49gL4uvlzOvj1czr49gL4uvlzOvj1czr49gL4uvlzOvj1czr49gL4uvlzOvj1czr49gL4uvljOvr1czr49gL4uvljOvr1czr49gL4uvljOvr1czr49gL4uvljOvr1czr49gL4uvljOvr1czr49psW9vnSJNL50iTS+psW9vnSJNL50iTS+psW9vnSJNL50iTS+psW9vnSJNL50iTS+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDq+Jh65vkB4Or5AeDo+Jh65vkB4Or5AeDo+Jh65vkB4Or5AeDo+Jh65vkB4Or5AeDo+Jh65vkB4Or5AeDo+Jh65vkB4Or5AeDo+psW9vnSJNL50iTQ+psW9vnSJNL50iTQ+psW9vnSJNL50iTQ+psW9vnSJNL50iTQ+Jh65vkR4Oj5AeDo+Jh65vkR4Oj5AeDo+Jh65vkR4Oj5AeDo+Jh65vkR4Oj5AeDo+Jh65vkR4Oj5AeDo+psW9vnSJND50iTQ+psW9vnSJND50iTQ+psW9vnSJND50iTQ+psW9vnSJND50iTQ+psW9vnSJND50iTS+psW9vnSJND50iTS+psW9vnSJND50iTS+Jh65vkR4Oj5AeDq+Jh65vkR4Oj5AeDq+Jh65vkR4Oj5AeDq+Jh65vkR4Oj5AeDq+Jh65vkR4Oj5AeDq+Jh65vkR4Oj5AeDq+ALZhPrCnQz7MzEy+ALZhPrCnQz7MzEy+ALZhPrCnQz7MzEy+ALZhPrCnQz7MzEy+ALZhPtDMTD6wp0O+ALZhPtDMTD6wp0O+ALZhPtDMTD6wp0O+ALZhPtDMTD6wp0O+ALZhPtDMTD6wp0O+HNtqPrCnQz6wp0O+HNtqPrCnQz6wp0O+HNtqPrCnQz6wp0O+HNtqPrCnQz6wp0O+ALZhPszMTL6wp0O+ALZhPszMTL6wp0O+ALZhPszMTL6wp0O+ALZhPszMTL6wp0O+ALZhPqynQ77MzEy+ALZhPqynQ77MzEy+ALZhPqynQ77MzEy+ALZhPqynQ77MzEy+HNtqPqynQ76wp0O+HNtqPqynQ76wp0O+HNtqPqynQ76wp0O+HNtqPqynQ76wp0O+HNtqPqynQ76wp0O+HNtqPqynQ76wp0O+HNtqPrCnQz6wp0M+HNtqPrCnQz6wp0M+HNtqPrCnQz6wp0M+HNtqPrCnQz6wp0M+HNtqPrCnQz6wp0M+HNtqPrCnQz6wp0M+ALZhPtDMTD6wp0M+ALZhPtDMTD6wp0M+ALZhPtDMTD6wp0M+ALZhPtDMTD6wp0M+ALZhPrCnQz7MzEw+ALZhPrCnQz7MzEw+ALZhPrCnQz7MzEw+ALZhPrCnQz7MzEw+HNtqPqynQ76wp0M+HNtqPqynQ76wp0M+HNtqPqynQ76wp0M+HNtqPqynQ76wp0M+ALZhPqynQ77MzEw+ALZhPqynQ77MzEw+ALZhPqynQ77MzEw+ALZhPqynQ77MzEw+ALZhPszMTL6wp0M+ALZhPszMTL6wp0M+ALZhPszMTL6wp0M+ALZhPszMTL6wp0M+ALZhPszMTL6wp0M+gL4uvqynQ76wp0O+gL4uvqynQ76wp0O+gL4uvqynQ76wp0O+gL4uvqynQ76wp0O+gL4uvqynQ76wp0O+ZJklvqynQ77MzEy+ZJklvqynQ77MzEy+ZJklvqynQ77MzEy+ZJklvqynQ77MzEy+ZJklvszMTL6wp0O+ZJklvszMTL6wp0O+ZJklvszMTL6wp0O+ZJklvszMTL6wp0O+ZJklvszMTL6wp0O+ZJklvszMTL6wp0M+ZJklvszMTL6wp0M+ZJklvszMTL6wp0M+ZJklvszMTL6wp0M+ZJklvqynQ77MzEw+ZJklvqynQ77MzEw+ZJklvqynQ77MzEw+ZJklvqynQ77MzEw+gL4uvqynQ76wp0M+gL4uvqynQ76wp0M+gL4uvqynQ76wp0M+gL4uvqynQ76wp0M+gL4uvqynQ76wp0M+gL4uvqynQ76wp0M+ZJklvrCnQz7MzEw+ZJklvrCnQz7MzEw+ZJklvrCnQz7MzEw+ZJklvrCnQz7MzEw+ZJklvtDMTD6wp0M+ZJklvtDMTD6wp0M+ZJklvtDMTD6wp0M+ZJklvtDMTD6wp0M+ZJklvtDMTD6wp0M+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AAAAAAAAAAAAAIA/AAAAAM0ENT8ZBTU/Tc0TPxTNEz9NzRM/8AQ1PwAAAAD3BDU/Tc0TPxTNE79NzRM/8AQ1PwAAAAD3BDU/EAU1P9cENb8AAACA//9/PwAAAAAAAACAAAAAAM0ENb8ZBTU/AAAAAAAAAAAAAIA/Tc0TPxTNE79NzRM/8AQ1PwAAAAD3BDU/AAAAAAAAgL8AAACAAAAAAM0ENb8ZBTU/Tc0TPxTNE79NzRM/EAU1P9cENb8AAACAKQU1P70ENb8AAACAAACAvwAAAABp1dU0AACAvwAAAAAAAACAEAU1v9cENb8AAACA8AQ1vwAAAAD3BDW/Tc0TvxTNE79NzRO/8AQ1vwAAAAD3BDW/Tc0TvxTNE79NzRO/AAAAAM0ENb8ZBTW/AAAAAAAAAAAAAIC/KQU1v70ENb8AAACAEAU1v9cENb8AAACATc0TvxTNE79NzRO/AAAAAAAAgL8AAACAAAAAAM0ENb8ZBTW/KQU1v70ENb8AAACATc0TvxTNE79NzRM/AAAAAAAAgL8AAACAAAAAAM0ENb8ZBTU/8AQ1vwAAAAD3BDU/Tc0TvxTNE79NzRM/AAAAAM0ENb8ZBTU/AAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAACAvwAAAAAAAACAKQU1v70ENb8AAACAEAU1v9cENb8AAACA8AQ1vwAAAAD3BDU/Tc0TvxTNE79NzRM/8AQ1vwAAAAD3BDU/Tc0TvxTNEz9NzRM/AAAAAAAAAAAAAIA/AAAAAM0ENT8ZBTU/KQU1v70ENT8AAACAEAU1v9cENT8AAACATc0TvxTNEz9NzRM/AAAAAM0ENT8ZBTU/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAACAvwAAAAAAAACAEAU1v9cENT8AAACA8AQ1vwAAAAD3BDU/Tc0TvxTNEz9NzRM/AACAvwAAAACMRFu0AACAvwAAAABp1dU0AACAvwAAAAAAAACAKQU1v70ENT8AAACAEAU1v9cENT8AAACA8AQ1vwAAAAD3BDW/Tc0TvxTNEz9NzRO/KQU1v70ENT8AAACATc0TvxTNEz9NzRO/AAAAAM0ENT8ZBTW/AAAAAAAAgD8AAACA8AQ1vwAAAAD3BDW/Tc0TvxTNEz9NzRO/AAAAAAAAAAAAAIC/AAAAAM0ENT8ZBTW/AACAPwAAAAAAAACA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" + "byteLength" : 8892, + "uri" : "data:application/octet-stream;base64,MO2MvVzOvj2RMhU+MO2MvVzOvj2RMhU+MO2MvVzOvj2RMhU+MO2MvVzOvj2RMhU+MO2MvVzOvj2RMhU+MO2MvVzOvj2RMhU+MO2MvVTOvr2RMhU+MO2MvVTOvr2RMhU+MO2MvVTOvr2RMhU+MO2MvVTOvr2RMhU+MO2MvVTOvr2RMhU+MO2MvVTOvr2RMhU+bGd8PVzOvj2SMhU+bGd8PVzOvj2SMhU+bGd8PVzOvj2SMhU+bGd8PVzOvj2SMhU+bGd8PVzOvj2SMhU+bGd8PVzOvj2SMhU+bGd8PVTOvr2SMhU+bGd8PVTOvr2SMhU+bGd8PVTOvr2SMhU+bGd8PVTOvr2SMhU+bGd8PVTOvr2SMhU+bGd8PVTOvr2SMhU+lQ4CvnKJNL5s4tw+lQ4CvnKJNL5s4tw+lQ4CvnKJNL5s4tw+lQ4CvnKJNL5s4tw+vjUGvj54Or5IPNY+vjUGvj54Or5IPNY+vjUGvj54Or5IPNY+vjUGvj54Or5IPNY+vjUGvj54Or5IPNY+vjUGvj54Or5IPNY+AbL9PT54Or5JPNY+AbL9PT54Or5JPNY+AbL9PT54Or5JPNY+AbL9PT54Or5JPNY+AbL9PT54Or5JPNY+AbL9PT54Or5JPNY+sGP1PXKJNL5t4tw+sGP1PXKJNL5t4tw+sGP1PXKJNL5t4tw+sGP1PXKJNL5t4tw+AbL9PUJ4Oj5JPNY+AbL9PUJ4Oj5JPNY+AbL9PUJ4Oj5JPNY+AbL9PUJ4Oj5JPNY+AbL9PUJ4Oj5JPNY+AbL9PUJ4Oj5JPNY+sGP1PXKJND5t4tw+sGP1PXKJND5t4tw+sGP1PXKJND5t4tw+sGP1PXKJND5t4tw+lQ4CvnKJND5s4tw+lQ4CvnKJND5s4tw+lQ4CvnKJND5s4tw+lQ4CvnKJND5s4tw+vjUGvkJ4Oj5IPNY+vjUGvkJ4Oj5IPNY+vjUGvkJ4Oj5IPNY+vjUGvkJ4Oj5IPNY+vjUGvkJ4Oj5IPNY+vjUGvkJ4Oj5IPNY+ggoTvq6nQz7LcNO+ggoTvq6nQz7LcNO+ggoTvq6nQz7LcNO+ggoTvq6nQz7LcNO+ggoTvq6nQz7LcNO+ggoTvq6nQz7LcNO+vKMMvs7MTD7KcNO+vKMMvs7MTD7KcNO+vKMMvs7MTD7KcNO+vKMMvs7MTD7KcNO+vKMMvs7MTD7KcNO+vKMMvs7MTD7KcNO+vqMMvq6nQz4D+dm+vqMMvq6nQz4D+dm+vqMMvq6nQz4D+dm+vqMMvq6nQz4D+dm+vqMMvq6nQz4D+dm+vKMMvsrMTL7KcNO+vKMMvsrMTL7KcNO+vKMMvsrMTL7KcNO+vKMMvsrMTL7KcNO+vKMMvsrMTL7KcNO+ggoTvqqnQ77LcNO+ggoTvqqnQ77LcNO+ggoTvqqnQ77LcNO+ggoTvqqnQ77LcNO+ggoTvqqnQ77LcNO+vqMMvqqnQ74D+dm+vqMMvqqnQ74D+dm+vqMMvqqnQ74D+dm+vqMMvqqnQ74D+dm+vqMMvqqnQ74D+dm+vqMMvqqnQ74D+dm+BEcFPq6nQz4B+dm+BEcFPq6nQz4B+dm+BEcFPq6nQz4B+dm+BEcFPq6nQz4B+dm+BEcFPq6nQz4B+dm+BEcFPq6nQz4B+dm+BkcFPs7MTD7IcNO+BkcFPs7MTD7IcNO+BkcFPs7MTD7IcNO+BkcFPs7MTD7IcNO+BkcFPs7MTD7IcNO+zK0LPq6nQz7JcNO+zK0LPq6nQz7JcNO+zK0LPq6nQz7JcNO+zK0LPq6nQz7JcNO+zK0LPq6nQz7JcNO+BEcFPqqnQ74B+dm+BEcFPqqnQ74B+dm+BEcFPqqnQ74B+dm+BEcFPqqnQ74B+dm+BEcFPqqnQ74B+dm+zK0LPqqnQ77JcNO+zK0LPqqnQ77JcNO+zK0LPqqnQ77JcNO+zK0LPqqnQ77JcNO+zK0LPqqnQ77JcNO+zK0LPqqnQ77JcNO+BkcFPsrMTL7IcNO+BkcFPsrMTL7IcNO+BkcFPsrMTL7IcNO+BkcFPsrMTL7IcNO+BkcFPsrMTL7IcNO+BkcFPsrMTL7IcNO+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+vqMMvqqnQ76QMhU+hgoTvqqnQ74fIgg+hgoTvqqnQ74fIgg+hgoTvqqnQ74fIgg+hgoTvqqnQ74fIgg+hgoTvqqnQ74fIgg+hgoTvqqnQ74fIgg+vqMMvsrMTL4eIgg+vqMMvsrMTL4eIgg+vqMMvsrMTL4eIgg+vqMMvsrMTL4eIgg+vqMMvsrMTL4eIgg+vqMMvsrMTL4eIgg+AkcFPsrMTL4hIgg+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" } ] } diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index b659c5e1..534d1a39 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -197,6 +197,10 @@ namespace Nuake { if (ImGuizmo::IsUsing()) { + // TODO: CALCAULATE DELTA BETWEEN THE GLOBAL TRANSFORMS, CALCULATE ROTAION, SCALe DELTAS + // AND add Them to each component. + // + // const Matrix4& transformDelta = // Since imguizmo returns a transform in global space and we want the local transform, // we need to multiply by the inverse of the parent's global transform in order to revert // the changes from the parent transform. @@ -217,32 +221,47 @@ namespace Nuake { Vector4 pesp = Vector4(); glm::decompose(localTransform, scale, rotation, pos, skew, pesp); - tc.Translation = pos; - rotation.w *= -1.0f; - tc.Rotation = rotation; - tc.Scale = scale; - tc.LocalTransform = localTransform; - //tc.Dirty = true; + float newScale[3]; + float newRot[3]; + float rotates[3]; + float newPos[3]; + ImGuizmo::DecomposeMatrixToComponents(glm::value_ptr(localTransform), newPos, newRot, newScale); + rotates[0] = -newRot[0]; + rotates[1] = -newRot[1]; + rotates[2] = newRot[2]; - const Matrix4& translationMatrix = glm::translate(Matrix4(1.0f), pos); - const Matrix4& rotationMatrix = glm::mat4_cast(rotation); + auto rott = QuatFromEuler(rotates[0], rotates[1], rotates[2]); + + + + const Matrix4& rotationMatrix = glm::mat4_cast(glm::conjugate(rott)); const Matrix4& scaleMatrix = glm::scale(Matrix4(1.0f), scale); + const Matrix4& translationMatrix = glm::translate(Matrix4(1.0f), pos); const Matrix4& newLocalTransform = translationMatrix * rotationMatrix * scaleMatrix; + + //assert(newLocalTransform == localTransform); + tc.Translation = pos; + tc.Rotation = glm::normalize(glm::conjugate(rotation)); + tc.Scale = scale; + tc.LocalTransform = newLocalTransform; + tc.Dirty = true; + + // Decompose global trasnform - Vector3 gscale = Vector3(); - Quat grotation = Quat(); - Vector3 gpos = Vector3(); - Vector3 gskew = Vector3(); - Vector4 gpesp = Vector4(); - glm::decompose(transform, gscale, grotation, gpos, gskew, gpesp); - - //glm::quat rotationQuaternionG = glm::quat_cast(transform); - tc.SetGlobalPosition(gpos); - tc.SetGlobalRotation(grotation); - tc.SetGlobalScale(gscale); - tc.SetGlobalTransform(localTransform); + //Vector3 gscale = Vector3(); + //Quat grotation = Quat(); + //Vector3 gpos = Vector3(); + //Vector3 gskew = Vector3(); + //Vector4 gpesp = Vector4(); + //glm::decompose(transform, gscale, grotation, gpos, gskew, gpesp); + // + ////glm::quat rotationQuaternionG = glm::quat_cast(transform); + //tc.SetGlobalPosition(gpos); + //tc.SetGlobalRotation(glm::conjugate(grotation)); + //tc.SetGlobalScale(gscale); + //tc.SetGlobalTransform(localTransform); } } @@ -375,9 +394,8 @@ namespace Nuake { if (ImGui::Selectable("Focus camera")) { Ref editorCam = Engine::GetCurrentScene()->m_EditorCamera; - editorCam->Translation = entity.GetComponent().GetGlobalPosition(); Vector3 camDirection = entity.GetComponent().CameraInstance->GetDirection(); - editorCam->SetDirection(camDirection); + editorCam->SetTransform(glm::inverse(entity.GetComponent().GetGlobalTransform())); } ImGui::Separator(); } diff --git a/Nuake/src/Core/Maths.cpp b/Nuake/src/Core/Maths.cpp index fc6761a8..9009df68 100644 --- a/Nuake/src/Core/Maths.cpp +++ b/Nuake/src/Core/Maths.cpp @@ -66,4 +66,16 @@ Vector3 Nuake::QuatToDirection(const Quat& quat) { return glm::normalize(quat * Vector3(0, 0, -1)); //return glm::normalize(glm::rotate(glm::inverse(quat), glm::vec3(-1.0, 0.0, 0.0))); +} + +void Nuake::Decompose(const Matrix4& m, Vector3& pos, Quat& rot, Vector3& scale) +{ + pos = m[3]; + for (int i = 0; i < 3; i++) + scale[i] = glm::length(Vector3(m[i])); + const glm::mat3 rotMtx( + glm::vec3(m[0]) / scale[0], + glm::vec3(m[1]) / scale[1], + glm::vec3(m[2]) / scale[2]); + rot = glm::quat_cast(rotMtx); } \ No newline at end of file diff --git a/Nuake/src/Core/Maths.h b/Nuake/src/Core/Maths.h index 13a91871..ba3b1c18 100644 --- a/Nuake/src/Core/Maths.h +++ b/Nuake/src/Core/Maths.h @@ -24,4 +24,5 @@ namespace Nuake Quat CreateFromAxisAngle(Vector3 axis, float angle); Quat QuatFromEuler(float x, float y, float z); Vector3 QuatToDirection(const Quat& quat); + void Decompose(const Matrix4& m, Vector3& pos, Quat& rot, Vector3& scale); } diff --git a/Nuake/src/Scene/Systems/TransformSystem.cpp b/Nuake/src/Scene/Systems/TransformSystem.cpp index ea80f716..cd7cfaa4 100644 --- a/Nuake/src/Scene/Systems/TransformSystem.cpp +++ b/Nuake/src/Scene/Systems/TransformSystem.cpp @@ -44,15 +44,16 @@ namespace Nuake if (transform.Dirty) { auto& localTranslate = transform.GetLocalPosition(); - auto& localRot = transform.GetLocalRotation(); + auto& localRot = glm::normalize(transform.GetLocalRotation()); auto& localScale = transform.GetLocalScale(); - const Matrix4& translationMatrix = glm::translate(Matrix4(1.0f), localTranslate); - //localRot.w *= -1.0f; + const Matrix4& rotationMatrix = glm::mat4_cast(localRot); const Matrix4& scaleMatrix = glm::scale(Matrix4(1.0f), localScale); const Matrix4& newLocalTransform = translationMatrix * rotationMatrix * scaleMatrix; + + //localRot *= -1.0f; //if(localRot.y != 0) // assert(newLocalTransform == transform.GetLocalTransform()); @@ -114,7 +115,7 @@ namespace Nuake camera.CameraInstance->Translation = transform.GlobalTranslation; auto globalRotation = transform.GetGlobalRotation(); - auto& trnaslationMatrix = glm::translate(Matrix4(1.0f), transform.GetGlobalPosition()); + auto& translationMatrix = glm::translate(Matrix4(1.0f), transform.GetGlobalPosition()); const Matrix4& rotationMatrix = glm::mat4_cast(globalRotation); Vector4 forward = Vector4(0, 0, -1, 1); const auto globalForward = rotationMatrix * forward; @@ -123,7 +124,7 @@ namespace Nuake const auto globalRight = rotationMatrix * right; camera.CameraInstance->Direction = globalForward; camera.CameraInstance->Right = globalRight; -; camera.CameraInstance->SetTransform(glm::inverse(trnaslationMatrix * rotationMatrix)); +; camera.CameraInstance->SetTransform(glm::inverse(translationMatrix * rotationMatrix)); } } }