@frilix
Иногда "творю"

Определение координаты мыши в мировой области OpenGL?

Добрый день! Пытаюсь получить координаты точки в сцене. Для этого использую туториал этот. Для этого был разработан класс 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. В чем может быть ошибка? (Буду признателен за помощь)
  • Вопрос задан
  • 417 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы