Я с трудом выяснить, что происходит с моей фактурой:2D текстура морфы в Ortographic проекции
В основном я Fetching потока веба как мой основным 2d текстуры холст в OpenGL, и в моем paintGL () Я рисую материал на нем (как изображения RGBA с GL_BLEND). Поскольку я использую Kinect в качестве источника данных, я также получаю значения глубины из отслеживаемого скелета (человека) и преобразовываю их в значения GL (XYZ, изменяющийся между 0.0f и 1.0f). Итак, моя цель состоит в том, что, например, загруженная 2D-текстура, такая как рубашка, теперь правильно отслеживает человека на моем выходном экране RGB. Но кажется, что мое понимание орфографической проекции неверно:
Я постоянно загружаю 4 преобразованные вершины в VBO, но всякий раз, когда я добавляю текстуру поверх этого динамического квадроцикла, он всегда обращен к экрану. Я подумал, что положить этот динамический квадрат между «фоновым» холстом и камерой приведет к правильной проекции квадроциклов на холст, что дало бы мне представление о коробке 2D-текстуры, которая, кажется, «согнется» всякий раз, когда человек вращается.
Но текстура всегда смотрит в камеру и не вращается. Я также попытался вручную повернуть через матрицу и установить ее в свой шейдер, но опять же, он поворачивает только квадрат вершины (поскольку: вращение просто уменьшает текстуру), а THEN ставит текстуру сверху, а не вращая текстуру с ним.
Итак, можно ли как-то правильно применить это к текстуре? Я подумал о смешении перспективной проекции в, но на самом деле не имею ни малейшего представления о том, как это реализовать ...
EDIT: Я на самом деле уже установил мою матрицу проекцию вверх, как следующее:
В 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);
clothTexture - это QOpenGLTexture, которая успешно загрузила изображение RGBA из файла. Результат: всякий раз, когда я активирую перспективу усечения, это приводит к черному экрану. Я думаю, что все правильно настроено: POV проходятся в направлении положительной оси в 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. Я что-то пропустил в настройке усечения? Я просто установил его так же, как орто ...
EDIT: Извините за отсутствие упоминания; матрица Я использую тип QMatrix4x4: Frustum
Эти функции умножить текущую матрицу с одним вы определяете в качестве аргумента, который должен дать тот же результат, как если бы я определяю Посмотреть матрицу, например, а затем определите шейдерную форму «mvp_matrix» как проекцию *, если я не ошибаюсь. Возможно, что-то вроде lookAt сделает трюк; Я просто попробую пообщаться. :)
Спасибо за ответ; Я обновил свой пост выше и добавил перспективу усечения ... – danksch