Добрый день! Пытаюсь получить координаты точки в сцене. Для этого использую туториал
этот. Для этого был разработан класс MousePicker:
#include "../../headers/renderEngine/MousePicker.h"
#include "../../headers/toolbox/Math.h"
MousePicker::MousePicker(Camera *camera, glm::mat4 projectionMatrix)
{
this->camera = camera;
this->projectionMatrix = projectionMatrix;
this->viewMatrix = Math::CreateViewMatrix(camera->getCameraPos(), camera->getCameraFront(), camera->getCameraUp());
}
void MousePicker::Update(Camera * camera)
{
this->camera = camera;
this->viewMatrix = Math::CreateViewMatrix(camera->getCameraPos(), camera->getCameraFront(), camera->getCameraUp());
currentRay = CalculateMouseRay();
}
glm::vec3 MousePicker::GetCurrentRay()
{
return currentRay;
}
glm::vec3 MousePicker::CalculateMouseRay()
{
glm::vec3 result;
int mouseX, mouseY;
SDL_GetMouseState(&mouseX, &mouseY);
glm::vec2 normalizedCoords = GetNormalizedDeviceCoords(mouseX, mouseY);
glm::vec4 clipCoords = glm::vec4(normalizedCoords.x, normalizedCoords.y, -1.0f, 1.0f);
glm::vec4 eyeCoords = ToEyeCoords(clipCoords);
result = ToWorldCoords(eyeCoords);
return result;
}
glm::vec2 MousePicker::GetNormalizedDeviceCoords(int mouseX, int mouseY)
{
float x = (2.0f * mouseX) / 800.0f - 1;
float y = 1.0f - (2.0f * mouseY) / 600.0f;
return glm::vec2(x, y);
}
glm::vec4 MousePicker::ToEyeCoords(glm::vec4 clipCoords)
{
glm::vec4 eyeCoords = glm::inverse(projectionMatrix) * clipCoords;
eyeCoords = glm::vec4(eyeCoords.x, eyeCoords.y, -1.0f, 0.0f);
return eyeCoords;
}
glm::vec3 MousePicker::ToWorldCoords(glm::vec4 eyeCoords)
{
glm::vec4 worldCoords = glm::inverse(viewMatrix) * eyeCoords;
glm::vec3 world = glm::vec3(worldCoords.x, worldCoords.y, worldCoords.z);
return glm::normalize(world);
}
В итоге получил, что по оси x и все работает хорошо, но вот по оси z получаются минимальные отклонения, хотя по идее они должны быть большими так как передний план задан как 0.1f а задний 100f , а отклонения колеблются около -1. В чем может быть ошибка? (Буду признателен за помощь)