Непроекты GLM возвращают неправильные результаты

#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 функцию…