From b514cd38a7b0ef5fcabbcbf82c89d0ed0b8aaccf Mon Sep 17 00:00:00 2001 From: karl Date: Tue, 7 Jan 2020 22:07:38 +0100 Subject: [PATCH] Movement is functional! There is a small bug that can occur, seems like gimbal lock or something like that. Only rarely though (close to coordinate origin?) --- ECS/Systems/KeyboardMovementSystem.h | 6 +++--- ECS/Systems/MouseLookSystem.h | 19 ++++++------------- ECS/Systems/RenderSystem.h | 2 +- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/ECS/Systems/KeyboardMovementSystem.h b/ECS/Systems/KeyboardMovementSystem.h index 0b63113..90a0917 100644 --- a/ECS/Systems/KeyboardMovementSystem.h +++ b/ECS/Systems/KeyboardMovementSystem.h @@ -44,7 +44,7 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscribereach([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->moving.x = 1; + movement->moving.x = -1; } else if (event.action == GLFW_RELEASE) { movement->moving.x = 0; } @@ -52,7 +52,7 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscribereach([&](Entity *ent, ComponentHandle movement) { if (event.action == GLFW_PRESS) { - movement->moving.x = -1; + movement->moving.x = 1; } else if (event.action == GLFW_RELEASE) { movement->moving.x = 0; } @@ -64,7 +64,7 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscribereach( [&](Entity *ent, ComponentHandle transform, ComponentHandle movement) { - transform->translate(glm::mat3x3(transform->matrix) * glm::vec3(movement->moving) * movement->speed * deltaTime); + transform->translate(glm::vec3(movement->moving) * movement->speed * deltaTime); }); } diff --git a/ECS/Systems/MouseLookSystem.h b/ECS/Systems/MouseLookSystem.h index 54ee472..a362615 100644 --- a/ECS/Systems/MouseLookSystem.h +++ b/ECS/Systems/MouseLookSystem.h @@ -28,7 +28,7 @@ public: void receive(World *pWorld, const MouseMoveEvent &event) override { pWorld->each([&](Entity *ent, ComponentHandle transform, ComponentHandle mouse, ComponentHandle camera) { - double xOffset = event.newX - lastX; + double xOffset = lastX - event.newX; double yOffset = lastY - event.newY; lastX = event.newX; @@ -46,21 +46,14 @@ public: if(pitch < -89.0f) pitch = -89.0f; - glm::vec3 direction; - direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch)); - direction.y = sin(glm::radians(pitch)); - direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch)); + glm::mat4x4 newTransform = glm::mat4x4(1.0); - glm::vec3 cameraOrigin = transform->getPosition(); - glm::vec3 cameraFront = glm::normalize(direction); - glm::vec3 cameraUp = glm::vec3(0.0, 1.0, 0.0); - glm::vec3 cameraRight = glm::cross(cameraFront, cameraUp); + newTransform = glm::rotate(newTransform, glm::radians((float)pitch), transform->right()); + newTransform = glm::rotate(newTransform, glm::radians((float)yaw), glm::vec3(0.0, 1.0, 0.0)); - glm::mat4x4 lookAt = glm::lookAt(cameraOrigin, cameraOrigin + cameraFront, cameraUp); + newTransform[3] = transform->matrix[3]; - lookAt[3] = glm::vec4(cameraOrigin, 1.0); - - transform->matrix = lookAt; + transform->matrix = newTransform; }); } diff --git a/ECS/Systems/RenderSystem.h b/ECS/Systems/RenderSystem.h index dcb03e5..8a9aa87 100644 --- a/ECS/Systems/RenderSystem.h +++ b/ECS/Systems/RenderSystem.h @@ -23,7 +23,7 @@ public: shader.use(); shader.setMat4("projection", camera->projection); - shader.setMat4("view", cameraTransform->matrix); + shader.setMat4("view", glm::inverse(cameraTransform->matrix)); pWorld->each([&](Entity *ent, ComponentHandle mesh, ComponentHandle transform) { shader.setMat4("model", transform->matrix);