2015-10-07 4 views
0

Я с трудом выяснить, что происходит с моей фактурой: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 сделает трюк; Я просто попробую пообщаться. :)

ответ

0

Для достижения желаемого результата вам необходимо использовать перспективную проекцию. Посмотрите here, например, код для создания проекционной матрицы перспективы с glm.

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

EDIT: в вашем коде, где я могу посмотреть на .frustum и .translate методов или из какой библиотеки проекция объект? Это не похоже на то, что вы делаете Projection * View, перемещая матрицу усеченного конуса. Some info о ролях стандартных матриц.

Рассмотрение отладки, если вы получаете на экране черный цвет вместо GL_COLOR_BUFFER_BIT проблема цвета не с матрицей, а раньше. Также я рекомендую console.log вашу перспективную матрицу и сравнить ее с правильной (что вы можете получить, например, в библиотеке glm).

+0

Спасибо за ответ; Я обновил свой пост выше и добавил перспективу усечения ... – danksch