#c #opengl #glm-math
Вопрос:
В своем проекте я использую довольно сложное стекло камеры, которое обеспечивает вращение трекбола / аркбола вокруг центра. Это прекрасно работает, софар. Для создания матрицы MVP я использую:
// Get a handle for our "MVP" uniform
GLuint MatrixID = glGetUniformLocation(shaderProgram, "MVP");
// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 <-> 100 units
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 4.0f / 3.0f, 0.1f, 50.f);
// Camera matrix
glm::mat4 view = camera->getMatrix();
// Model matrix -> identity matrix (origin)
glm::mat4 model = glm::mat4(1.0f);
// our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP = projection * view * model;
VertexShader также неудивителен (просто показываю часть здесь) v_position = MVP * vec4(vPos,1);
и до сих пор работает хорошо.
Чтобы получить нормализованное направление, на которое указывает мышь, я использую следующий код: direction = glm::normalize( glm::unProject(glm::vec3(mouseX,700 - mouseY, 1), model, projection, glm::vec4(0.0f, 0.0f, 700, 700)));
— здесь 700-это ширина и высота экрана.
В какой-то другой момент я пытаюсь выполнить тесты пересечений с помощью функции glm intersectRayTriangle: glm::intersectRayTriangle(cameraPosition, direction , v0, v1, v2, intersectionPos, dist)
И вот в чем проблема: я не получаю правильных результатов, поэтому я предполагаю, что где-то в коде unProject существует ошибка. Может быть, у кого-то есть идея на этот счет.
Ответ №1:
Очевидно, что вид луча для каждого пикселя будет зависеть от view
матрицы, но здесь:
direction = glm::normalize( glm::unProject(glm::vec3(mouseX,700 - mouseY, 1), model, projection, glm::vec4(0.0f, 0.0f, 700, 700)));
вы вообще не принимаете view
матрицу во внимание.
Вам нужно использовать view * model
в качестве model
параметра. Или, может быть, просто view
если вам нужны координаты мирового пространства.
Имена параметров для glm::unProject
функции на самом деле вводят в заблуждение здесь. Позвольте мне просмотреть справочные страницы:
GLM_FUNC_DECL tvec3<T, P> glm::unProject ( tvec3< T, P > const amp; win, tmat4x4< T, P > const amp; model, tmat4x4< T, P > const amp; proj, tvec4< U, P > const amp; viewport)
Со следующим описанием (выделено мной):
model
Задает матрицу представления модели
Поскольку glm пытается имитировать старые устаревшие функции GL, а конвейер фиксированных функций в GL всегда использовался для сохранения полного преобразования в разложенной форме в ModelView
Projection
виде матриц и, это понятно любому, кто знает старую gluUnproject
функцию…