Witam, w moim programie chcę wykryć czy prosta przecina trójkąt (prosta ta to promień który wychodzi z punktu w którym jest myszka). Próbuję to zrobić na podstawie tej strony i filmiku, ale nie rozumiem co oznaczają te wszystkie wektory typy vo, v1, albo kierunek promienia a przede wszystkim nie wiem skąd mam je wziąć aby użyć ich w kodzie. Wiem znam jedynie pozycje myszki. Proszę o dokładnie wytłumaczenie i z góry dziękuję za pomoc.
tutaj kod który zwraca koordynaty na których jest aktualnie myszka
#include "MousePicker.h"
MousePicker::MousePicker(Camera* camera, glm::mat4 projection, GLFWwindow* window)
{
this->camera = camera;
this->window = window;
projectionMatrix = projection;
viewMatrix = camera->GetViewMatrix();
}
glm::vec3 MousePicker::getCurrentRay()
{
return this->currentRay;
}
void MousePicker::update()
{
viewMatrix = camera->GetViewMatrix();
currentRay = calculateMouseRay();
}
glm::vec3 MousePicker::calculateMouseRay()
{
glfwGetCursorPos(window, &this->mouseX, &this->mouseY);
glm::vec3 normalizedCoords = this->getNormalizedCoords(mouseX, mouseY);
glm::vec4 rayClip = glm::vec4(normalizedCoords.x, normalizedCoords.y, -normalizedCoords.z, 1.0f);
glm::vec4 eyeCoords = this->toEyeCoords(rayClip);
glm::vec3 worldRay = this->toWorldCoords(eyeCoords);
return worldRay;
}
glm::vec3 MousePicker::getNormalizedCoords(double xPos, double yPos)
{
int width, height;
glfwGetWindowSize(window, &width, &height);
double x = ((2.0f * xPos) / (double)(width)) - 1.0f;
double y = 1.0f - ((2.0f * yPos) / (double)(height));
return glm::vec3(width, height, 1.0f);
}
glm::vec4 MousePicker::toEyeCoords(glm::vec4 rayClip)
{
glm::mat4 invertedProjection = glm::inverse(projectionMatrix);
glm::vec4 eyeCoords = invertedProjection * rayClip;
return glm::vec4(eyeCoords.x, eyeCoords.y, -1.0f, 0.0f);
}
glm::vec3 MousePicker::toWorldCoords(glm::vec4 eyeCoords)
{
glm::mat4 invertedView = glm::inverse(viewMatrix);
glm::vec3 rayWorld = invertedView * eyeCoords;
glm::vec3 finalRayWorld = glm::vec3(rayWorld.x, rayWorld.y, rayWorld.z);
finalRayWorld = glm::normalize(finalRayWorld);
return finalRayWorld;
}
#pragma once
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "Camera.h"
class MousePicker
{
private:
glm::vec3 currentRay;
glm::mat4 projectionMatrix;
glm::mat4 viewMatrix;
double mouseX = 0.0f;
double mouseY = 0.0f;
Camera *camera;
GLFWwindow* window;
glm::vec3 calculateMouseRay();
glm::vec3 getNormalizedCoords(double mouseX, double mouseY);
glm::vec4 toEyeCoords(glm::vec4 rayClip);
glm::vec3 toWorldCoords(glm::vec4 eyeCoords);
public:
MousePicker(Camera* camera, glm::mat4 projection, GLFWwindow* window);
glm::vec3 getCurrentRay();
void update();
};