2012-03-28 3 views
3

Я не уверен, как использовать Unproject method, предоставляемый GLM.Использование Unproject GLM

В частности, в каком формате находится окно просмотра? И почему функция не требует матрицы представления, а также проекционной и мировой матрицы?

ответ

15

Здесь требуется немного истории. Непроект GLM фактически является более или менее прямой заменой функции gluUnProject, которая использует устаревший рендеринг фиксированной функции OpenGL. В этом режиме матрица Model и View фактически была объединена в матрице ModelView. По-видимому, автор GLM отбросил часть «взгляда» в наименовании, что еще больше смущает вещь, но это сводится к передаче чего-то вроде view*model.

Теперь для фактического использования:

  • победа является вектором, который содержит три компонента, которые имеют смысл в координатах окна. Это координаты «x, y» в вашем окне просмотра, координата «z», которую вы обычно извлекаете, считывая буфер глубины на (x,y).
  • Модель, матрица представлений и проекций должны говорить сами за себя, если вы даже думаете об использовании этой функции , Но полезно (opengl-specific) refresher.
  • Видовой экран определяется как glViewport, что означает (x, y, w, h). X и Y указывают нижний левый угол вашего окна просмотра (обычно 0,0). Ширина и высота (w, h). Обратите внимание, что во многих других системах x, y задает верхний левый угол, вы должны затем преобразовать y-координату, которая показана в коде NeHe, который я ссылаюсь ниже.

При применении вы просто заканчиваете, преобразовывая предоставленные координаты окна обратно в координаты объекта, более или менее обратные к тому, что обычно делает ваш код визуализации.

Полупорядочное объяснение по оригиналу gluUnProject можно найти как NeHe article. Но, конечно же, это OpenGL-специфический, в то время как glm может использоваться в других контекстах.

+3

За исключением того, что область просмотра не принимается за матрицу. Это четыре поплавка. Отсюда моя путаница в том, какой порядок и т. Д. Эти параметры действительно находятся. – Puppy

+0

@DeadMG: Верно, я обновил ответ. – KillianDS

2

Видовой экран передается как четыре поплавка: координаты окна x и y окна просмотра, за которыми следуют его ширина и высота. Это тот же порядок, который используется, например. по glGetFloatv(GL_VIEWPORT, ...). Таким образом, в большинстве случаев, первые два значения должны быть равны 0.

Как KillianDS уже отмечалось, model аргумент на самом деле представляет собой видовую матрицу, см пример использования unProject() в gtx_simd_mat4.cpp, функции test_compute_gtx():

glm::mat4 E = glm::translate(D, glm::vec3(1.4f, 1.2f, 1.1f)); 
    glm::mat4 F = glm::perspective(i, 1.5f, 0.1f, 1000.f); 
    glm::mat4 G = glm::inverse(F * E); 
    glm::vec3 H = glm::unProject(glm::vec3(i), G, F, E[3]); 

Как вы можете видеть, матрица, переданная как второй аргумент, в основном является произведением перевода и перспективным преобразованием.

Смежные вопросы