Я не уверен, как использовать Unproject method, предоставляемый GLM.Использование Unproject GLM
В частности, в каком формате находится окно просмотра? И почему функция не требует матрицы представления, а также проекционной и мировой матрицы?
Я не уверен, как использовать Unproject method, предоставляемый GLM.Использование Unproject GLM
В частности, в каком формате находится окно просмотра? И почему функция не требует матрицы представления, а также проекционной и мировой матрицы?
Здесь требуется немного истории. Непроект GLM фактически является более или менее прямой заменой функции gluUnProject
, которая использует устаревший рендеринг фиксированной функции OpenGL. В этом режиме матрица Model и View фактически была объединена в матрице ModelView. По-видимому, автор GLM отбросил часть «взгляда» в наименовании, что еще больше смущает вещь, но это сводится к передаче чего-то вроде view*model
.
Теперь для фактического использования:
(x,y)
.При применении вы просто заканчиваете, преобразовывая предоставленные координаты окна обратно в координаты объекта, более или менее обратные к тому, что обычно делает ваш код визуализации.
Полупорядочное объяснение по оригиналу gluUnProject
можно найти как NeHe article. Но, конечно же, это OpenGL-специфический, в то время как glm может использоваться в других контекстах.
Видовой экран передается как четыре поплавка: координаты окна 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]);
Как вы можете видеть, матрица, переданная как второй аргумент, в основном является произведением перевода и перспективным преобразованием.
За исключением того, что область просмотра не принимается за матрицу. Это четыре поплавка. Отсюда моя путаница в том, какой порядок и т. Д. Эти параметры действительно находятся. – Puppy
@DeadMG: Верно, я обновил ответ. – KillianDS