2D текстура морфа в ортографической проекции
Мне трудно понять, что происходит с моей текстурой:
По сути, я получаю поток с веб-камеры в качестве основы для двухмерной текстуры в OpenGL, а в своем paintGL() я рисую на нем материал (как изображения RGBA с GL_BLEND). Поскольку я использую Kinect в качестве источника данных, я также получаю значения глубины от отслеживаемого скелета (человека) и преобразовываю их в значения GL (XYZ варьируется от 0,0f до 1,0f). Поэтому моя цель состоит в том, чтобы, например, загруженная 2D-текстура, например, рубашка, теперь правильно отслеживала человека на моем RGB-дисплее. Но, похоже, мое понимание орфографической проекции неверно:
Я постоянно загружаю 4 преобразованные вершины в VBO, но всякий раз, когда я помещаю текстуру поверх этого динамического четырехугольника, она всегда обращена к экрану. Я думал, что размещение этого динамического четырехугольника между "фоновым" холстом и камерой приведет к правильной проекции четырехугольника на холст, что даст мне впечатление искривленной 2D-текстуры, которая, кажется, "изгибается" всякий раз, когда человек вращается.
Но текстура всегда обращена к камере и не вращается. Я также попытался вручную повернуть матрицу и установить ее в свой шейдер, но опять же, он вращает только сам квадратик вершины (так как: вращение просто уменьшает текстуру), а ТО помещает текстуру поверх, а не вращает текстура с ним.
Итак, возможно ли как-то правильно применить это к текстуре? Я думал о смешивании перспективной проекции, но на самом деле понятия не имею, как это реализовать...
РЕДАКТИРОВАТЬ: я уже настроил матрицу проекции следующим образом:
В resizeGL ():
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
В paintGL():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST); // turning this on/off makes no difference
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, &textureID);
program.setUniformValue("mvp_matrix", projection);
program.setUniformValue("texture", 0);
//draw 2d background quad
drawQuad();
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// switch to frustum to give perspective view
projection.setToIdentity();
projection.frustum(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
projection.translate(0.0f, 0.0f, 3.0f);
// bind cloth texture and draw ontop 2d quad
clothTexture->bind();
program.setUniformValue("mpv_matrix", projection);
drawShirtQuad();
// reset to ortho view
projection.setToIdentity();
projection.ortho(0.0f, 1.0f, 0.0f, 1.0f, 2.0f, -5.0f);
// release texture
clothTexture->release();
glDisable(GL_BLEND);
fabricTexture - это QOpenGLTexture, которая успешно загрузила изображение RGBA из файла. Результат: всякий раз, когда я активирую перспективу усеченного конуса, это приводит к черному экрану. Я думаю, что все правильно настроено: POV перемещается к положительной оси z в resizeGL(), и все вершины ткани изменяются между 0 и 1 в XYZ, в то время как фон располагается в:
(0,0f, 0,0f, -1,0f), (1,0f, 0,0f, -1,0f), (1,0f, 1,0f, -1,0f), (0,0f, 1,0f, -1,0f).
Таким образом, объект одежды всегда располагается между фоновой плоскостью и POV. Я что-то упустил в настройке усеченного конуса? Я просто настроил его так же, как орто...
РЕДАКТИРОВАТЬ: Извините, что не упомянул; Я использую матрицу типа QMatrix4x4: Frustum
Эти функции умножают текущую матрицу на ту, которую вы определили в качестве аргумента, что должно дать тот же результат, как если бы я определил, например, матрицу просмотра, а затем определил свою форму шейдера "mvp_matrix" как проекционное * представление, если я не ошибается. Может быть, что-то вроде lookAt сделает свое дело; Я просто попробую больше возиться.:)
1 ответ
Вам нужно использовать перспективную проекцию для достижения желаемого результата. Посмотрите здесь пример кода для создания матрицы перспективной проекции с помощью glm.
Перемещение вершин не понадобится, так как вы получите правильные позиции с поворотом, примененным в матрице модели.
РЕДАКТИРОВАТЬ: в вашем коде, где я могу посмотреть на методы.frustum и .translate или из какого объекта проекции библиотеки? Это не похоже на то, что вы делаете Projection * View, перемещая матрицу усеченного конуса. Некоторая информация о ролях стандартных матриц.
Учитывая отладку, если вместо экрана GL_COLOR_BUFFER_BIT отображается черный цвет, проблема не в матрице, а в более ранней версии. Также я рекомендую console.log вашу матрицу перспективы и сравнить ее с правильной (которую вы можете получить, например, в библиотеке glm).